UNPKG

@auth/core

Version:

Authentication for the Web.

171 lines (170 loc) 8.09 kB
/** * <div class="provider" style={{backgroundColor: "#24292f", display: "flex", justifyContent: "space-between", color: "#fff", padding: 16}}> * <span>Built-in <b>NetSuite</b> integration.</span> * <a href="https://system.netsuite.com"> * <img style={{display: "block"}} src="https://authjs.dev/img/providers/netsuite.svg" height="48" width="48"/> * </a> * </div> * * @module providers/netsuite */ /** * Add Netsuite login to your page and make requests to: * - [NetSuite RESTLets](https://docs.oracle.com/en/cloud/saas/netsuite/ns-online-help/section_4567507062.html#Tracking-RESTlet-Calls-Made-with-TBA-and-OAuth-2.0). * - [NetSuite REST Web Services](https://docs.oracle.com/en/cloud/saas/netsuite/ns-online-help/book_1559132836.html#SuiteTalk-REST-Web-Services-API-Guide). * * ### Setup * * #### Disclaimer * By using this provider, you consent to sharing your data with NetSuite. * By using this provider we assume you comply with NetSuite's [Terms of Service](https://www.netsuite.com/portal/assets/pdf/terms_of_service.pdf) and [Privacy Policy](https://www.oracle.com/legal/privacy). * The author of this provider is not affiliated with NetSuite. Proceeding with this provider you must be a NetSuite customer and have a NetSuite account (Full access user). * **Ensure the OAuth 2.0 Feature is enabled in your NetSuite account with the proper permissions set up on the current role/user** * * Before setting up the provider, you will need to: * - [Create an Integration Record](https://docs.oracle.com/en/cloud/saas/netsuite/ns-online-help/section_157771733782.html#procedure_157838925981) * - Uncheck the TBA Auth Flow checkbox. * - Check OAuth 2.0 Auth Flow checkbox. * - Copy and paste the `Callback URL` below into the `Redirect URI` field. * - Then select the scope(s) you want to use. * - **REST Web Services** (`rest_webservices`) - Access to REST Web Services. * - **RESTlets**(`restlets`) - Access to RESTLets. * - **SuiteAnalytics Connect** (`suiteanalytics_connect`) - Access to SuiteAnalytics Connect. * - Add any policies you want to use. * - Application Logo (_Optional_) (Shown to users when they are asked to grant access to your application). - Consent Screen * - Application Terms of Use (_Optional_) - A PDF file that contains the terms of use for your application. - Consent Screen * - Application Privacy Policy (_Optional_) - A PDF file that contains the privacy policy for your application. - Consent Screen * - OAuth 2.0 Consent Policy Preference - This setting determines whether the user is asked to grant access to your application **every time** they sign in or only the **first time** they sign in or **never**. * - **Save** the Integration record. * - The Integration record will be used to generate the `clientId` and `clientSecret` for the provider. **Save the generated values for later** * * #### Callback URL * * :::tip * When setting the Redirect URI in the Integration record, you must use the `https` protocol. * Otherwise, you will get an error when trying to sign in. (_INVALID_LOGIN_ATTEMPT_). * If you are testing locally, you can use a service like [ngrok](https://ngrok.com/) to create a secure tunnel to your localhost. * ::: * * ``` * https://example.com/api/auth/callback/netsuite * ``` * * :::tip * Our `userinfo` needs to compose of a suitelet or RESTLet url that gives us the information about the user. This has to be very fast in which the handshake profile gather execution can't take long. * The best bet is to use the `N/runtime` module to get the basics first. - Here is an example of a RESTlet below. Be sure to deploy and enable access to "All Roles". * ::: * * #### Example RESTLet Callback Handler * Be sure to deploy and use the **external** RESTLet url of any usage of the URIs. * * ```js * * /** * * @NApiVersion 2.1 * * @NScriptType Restlet * *\/ * define(["N/runtime"], /** * @param{runtime} runtimee * \/ (runtime) => { * /** * * Defines the function that is executed when a GET request is sent to a RESTlet. * * @param {Object} requestParams - Parameters from HTTP request URL; parameters passed as an Object (for all supported * * content types) * * @returns {string | Object} HTTP response body; returns a string when request Content-Type is 'text/plain'; returns an * * Object when request Content-Type is 'application/json' or 'application/xml' * * @since 2015.2 * *\/ * const get = (requestParams) => { * let userObject = runtime.getCurrentUser(); * * try { * log.debug({ title: "Payload received:", details: requestParams }); * * const { id, name, role, location, email, contact } = userObject; * * log.audit({ title: "Current User Ran", details: name }); * * let user = { * id, * name, * role, * location, * email, * contact, * }; * * log.debug({ title: "Returning user", details: user }); * * return JSON.stringify(user); * } catch (e) { * log.error({ title: "Error grabbing current user:", details: e }); * } * }; * * return { * get, * }; * ); * ``` * * > **Note**: Above is an example of returning the basic runtime information. Be sure to create a new script record and deployment record. Upon saving the deployment record. We will get our URLs for our RESTlet. * * ### Configuration * * ```ts * import { Auth } from "@auth/core" * import Netsuite from "@auth/core/providers/netsuite" * * const request = new Request(origin) * const response = await Auth(request, { * providers: [ * NetSuite({ * accountID: NETSUITE_ACCOUNT_ID, // EX: TSTDRV1234567 or 81555 for prod, and 1234567-SB1 for Sandbox accounts not "_" use "-". * // Returns the current user using the N/runtime module. This url can be a suitelet or RESTlet (Recommended) * // Using getCurrentUser(); So we match this schema returned from this RESTlet in the profile callback. (Required) * userinfo: "https://1234567.restlets.api.netsuite.com/app/site/hosting/restlet.nl?script=123&deploy=1", * }) * ], * }) * ``` * * ### Resources * * - [NetSuite - Creating an Integration Record (OAuth 2.0)](https://docs.oracle.com/en/cloud/saas/netsuite/ns-online-help/section_157771733782.html#Related-Topics) * - [NetSuite - Authorizing OAuth Requests](https://docs.github.com/en/developers/apps/building-oauth-apps/authorizing-oauth-apps) * - [NetSuite - Configure OAuth Roles](https://docs.oracle.com/en/cloud/saas/netsuite/ns-online-help/section_157771510070.html#Set-Up-OAuth-2.0-Roles) * - [Learn more about NetSuite OAuth 2.0](https://docs.oracle.com/en/cloud/saas/netsuite/ns-online-help/chapter_157769826287.html#OAuth-2.0) * * ### Notes * * :::tip * Make sure the `userinfo` matches the return type of the profile callback to ensure the user session gets read correctly. * To override the defaults for your use case, check out [customizing a built-in OAuth provider](https://authjs.dev/guides/providers/custom-provider#override-default-options). * ::: * */ export default function NetSuite(config) { const { accountID } = config; return { id: "netsuite", name: "NetSuite", type: "oauth", checks: ["state"], authorization: { url: `https://${accountID}.app.netsuite.com/app/login/oauth2/authorize.nl`, params: { scope: "restlets rest_webservices" }, }, token: `https://${accountID}.suitetalk.api.netsuite.com/services/rest/auth/oauth2/v1/token`, profile(profile) { // This is the default runtime.getCurrentUser() object returned from the RESTlet or SUITELet return { id: profile.id.toString(), name: profile.name, email: profile.email, image: null, }; }, style: { logo: "/netsuite.svg", bg: "#181a1b", text: "#fbfbfb" }, options: config, }; }