UNPKG

@simulacrum/auth0-simulator

Version:

Run local instance of Auth0 API for local development and integration testing

144 lines (142 loc) 4.28 kB
const require_rolldown_runtime = require('../_virtual/rolldown_runtime.cjs'); require('../store/entities.cjs'); require('../store/index.cjs'); const require_utils = require('./utils.cjs'); const require_date = require('../auth/date.cjs'); const require_jwt = require('../auth/jwt.cjs'); const require_rules_runner = require('../rules/rules-runner.cjs'); const require_refresh_token = require('../auth/refresh-token.cjs'); let assert_ts = require("assert-ts"); let base64_url = require("base64-url"); //#region src/handlers/oauth-handlers.ts const createTokens = async ({ body, iss, clientID, audience, rulesDirectory, scope: scopeConfig, simulationStore }) => { let { grant_type } = body; let scope = require_utils.deriveScope({ scopeConfig, clientID, audience }); let accessToken = getBaseAccessToken({ iss, grant_type, scope, audience }); let user; let nonce; if (grant_type === "client_credentials") return { access_token: require_jwt.createJsonWebToken(accessToken) }; else if (grant_type === "refresh_token") { let { refresh_token: refreshTokenValue } = body; let refreshToken = JSON.parse((0, base64_url.decode)(refreshTokenValue)); user = require_utils.createPersonQuery(simulationStore)((person) => person.id === refreshToken.user.id); nonce = refreshToken.nonce; (0, assert_ts.assert)(!!nonce, `400::No nonce in request`); } else { let result = verifyUserExistsInStore({ simulationStore, body, grant_type }); user = result.user; nonce = result.nonce; } (0, assert_ts.assert)(!!user, "500::No user found"); let { idTokenData, userData } = getIdToken({ body, iss, user, clientID, nonce }); let context = { clientID, accessToken: { scope, sub: idTokenData.sub }, idToken: idTokenData }; await require_rules_runner.createRulesRunner(rulesDirectory)(userData, context); return { access_token: require_jwt.createJsonWebToken({ ...accessToken, ...context.accessToken, ...scope.split(" ").includes("email") ? { email: user.email } : {} }), id_token: require_jwt.createJsonWebToken({ ...userData, ...context.idToken }), refresh_token: require_refresh_token.issueRefreshToken(scope, grant_type) ? require_refresh_token.createRefreshToken({ exp: idTokenData.exp, rotations: 0, scope, user, nonce }) : void 0 }; }; const getIdToken = ({ body, iss, user, clientID, nonce }) => { let userData = { name: body?.name ?? user.name, email: body?.email ?? user.email, email_verified: true, user_id: body?.id ?? user.id, nickname: body?.nickname, picture: body?.picture ?? user.picture, identities: body?.identities }; (0, assert_ts.assert)(!!user.email, "500::User in store requires an email"); let idTokenData = { alg: "RS256", typ: "JWT", iss, exp: require_date.expiresAt(), iat: require_date.epochTime(), email: user.email, aud: clientID, sub: user.id }; if (typeof nonce !== "undefined") idTokenData.nonce = nonce; return { userData, idTokenData }; }; const getBaseAccessToken = ({ iss, grant_type, scope, audience }) => ({ iss, exp: require_date.expiresAt(), iat: require_date.epochTime(), aud: audience, gty: grant_type, scope }); const verifyUserExistsInStore = ({ simulationStore, body, grant_type }) => { let { code } = body; let personQuery = require_utils.createPersonQuery(simulationStore); let nonce; let username; let password; if (grant_type === "http://auth0.com/oauth/grant-type/passwordless/otp") username = body.username; else if (grant_type === "password") { username = body.username; password = body.password; } else { (0, assert_ts.assert)(typeof code !== "undefined", "400::no code in /oauth/token"); [nonce, username] = (0, base64_url.decode)(code).split(":"); (0, assert_ts.assert)(!!username, `400::no nonce in store for ${code}`); } let user = personQuery((person) => { (0, assert_ts.assert)(!!person.email, `500::no email defined on person scenario`); let valid = person.email.toLowerCase() === username.toLowerCase(); if (typeof password === "undefined") return valid; else return valid && password === person.password; }); (0, assert_ts.assert)(!!user, "401::Unauthorized"); return { user, nonce }; }; //#endregion exports.createTokens = createTokens;