@wandelbots/nova-js
Version:
Official JS client for the Wandelbots API
91 lines (81 loc) • 3.03 kB
text/typescript
const DOMAIN_SUFFIX = "wandelbots.io"
/** Mapping of stages to Auth0 configurations */
const auth0ConfigMap = {
dev: {
domain: `https://auth.portal.dev.${DOMAIN_SUFFIX}`,
clientId: process.env.NOVA_AUTH0_DEV_CLIENT_ID,
},
stg: {
domain: `https://auth.portal.stg.${DOMAIN_SUFFIX}`,
clientId: process.env.NOVA_AUTH0_STG_CLIENT_ID,
},
prod: {
domain: `https://auth.portal.${DOMAIN_SUFFIX}`,
clientId: process.env.NOVA_AUTH0_PROD_CLIENT_ID,
},
}
/** Determine which Auth0 configuration to use based on instance URL */
const getAuth0Config = (instanceUrl: string) => {
if (instanceUrl.includes(`dev.${DOMAIN_SUFFIX}`)) return auth0ConfigMap.dev
if (instanceUrl.includes(`stg.${DOMAIN_SUFFIX}`)) return auth0ConfigMap.stg
if (instanceUrl.includes(DOMAIN_SUFFIX)) return auth0ConfigMap.prod
throw new Error(
"Unsupported instance URL. Cannot determine Auth0 configuration.",
)
}
/**
* Initializes Auth0 login process using redirect if necessary and retrieves an access token.
* Returns null when an access token should not be needed to authenticate (i.e. cookie auth
* when deployed on the instance domain)
*/
export const loginWithAuth0 = async (
instanceUrl: string,
): Promise<string | null> => {
if (typeof window === "undefined") {
throw new Error(
`Access token must be set to use NovaClient when not in a browser environment.`,
)
}
const auth0Config = getAuth0Config(instanceUrl)
if (new URL(instanceUrl).origin === window.location.origin) {
// When deployed on the instance itself, our auth is handled by cookies
// and no access token is needed-- just need to reload the page and it'll
// login again / set cookie as needed
window.location.reload()
throw new Error(
"Failed to reload page to get auth details, please refresh manually",
)
}
// If we're on localhost or another domain, we need to do the full oauth flow
// Note this will ONLY work for origins which are whitelisted as a redirect_uri
// in the auth0 config, currently
const { Auth0Client } = await import("@auth0/auth0-spa-js")
const auth0Client = new Auth0Client({
domain: auth0Config.domain,
clientId: auth0Config.clientId ?? "",
useRefreshTokens: false,
authorizationParams: {
audience: "nova-api",
redirect_uri: window.location.origin,
},
})
// If the URL includes a redirect result, handle it
if (
window.location.search.includes("code=") &&
window.location.search.includes("state=")
) {
const { appState } = await auth0Client.handleRedirectCallback()
// Return to the URL the user was originally on before the redirect
window.history.replaceState(
{},
document.title,
appState?.returnTo || window.location.pathname,
)
} else {
// Initiate login with redirect
await auth0Client.loginWithRedirect()
}
// Once logged in, retrieve the access token silently
const accessToken = await auth0Client.getTokenSilently()
return accessToken
}