UNPKG

next-auth

Version:

Authentication for Next.js

270 lines (226 loc) 7.93 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.NextAuthHandler = NextAuthHandler; var _logger = _interopRequireWildcard(require("../lib/logger")); var routes = _interopRequireWildcard(require("./routes")); var _pages = _interopRequireDefault(require("./pages")); var _init = require("./init"); var _assert = require("./lib/assert"); var _cookie = require("./lib/cookie"); function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } async function NextAuthHandler(params) { var _req$body$callbackUrl, _req$body, _req$query, _req$body2; const { options: userOptions, req } = params; (0, _logger.setLogger)(userOptions.logger, userOptions.debug); const assertionResult = (0, _assert.assertConfig)(params); if (typeof assertionResult === "string") { _logger.default.warn(assertionResult); } else if (assertionResult instanceof Error) { const { pages, theme } = userOptions; _logger.default.error(assertionResult.code, assertionResult); if (pages !== null && pages !== void 0 && pages.error) { return { redirect: `${pages.error}?error=Configuration` }; } const render = (0, _pages.default)({ theme }); return render.error({ error: "configuration" }); } const { action, providerId, error } = req; const { options, cookies } = await (0, _init.init)({ userOptions, action, providerId, host: req.host, callbackUrl: (_req$body$callbackUrl = (_req$body = req.body) === null || _req$body === void 0 ? void 0 : _req$body.callbackUrl) !== null && _req$body$callbackUrl !== void 0 ? _req$body$callbackUrl : (_req$query = req.query) === null || _req$query === void 0 ? void 0 : _req$query.callbackUrl, csrfToken: (_req$body2 = req.body) === null || _req$body2 === void 0 ? void 0 : _req$body2.csrfToken, cookies: req.cookies, isPost: req.method === "POST" }); const sessionStore = new _cookie.SessionStore(options.cookies.sessionToken, req, options.logger); if (req.method === "GET") { const render = (0, _pages.default)({ ...options, query: req.query, cookies }); const { pages } = options; switch (action) { case "providers": return await routes.providers(options.providers); case "session": return await routes.session({ options, sessionStore }); case "csrf": return { headers: [{ key: "Content-Type", value: "application/json" }], body: { csrfToken: options.csrfToken }, cookies }; case "signin": if (pages.signIn) { let signinUrl = `${pages.signIn}${pages.signIn.includes("?") ? "&" : "?"}callbackUrl=${options.callbackUrl}`; if (error) signinUrl = `${signinUrl}&error=${error}`; return { redirect: signinUrl, cookies }; } return render.signin(); case "signout": if (pages.signOut) return { redirect: pages.signOut, cookies }; return render.signout(); case "callback": if (options.provider) { const callback = await routes.callback({ body: req.body, query: req.query, method: req.method, headers: req.headers, cookies: req.cookies, options, sessionStore }); if (callback.cookies) cookies.push(...callback.cookies); return { ...callback, cookies }; } break; case "verify-request": if (pages.verifyRequest) { return { redirect: pages.verifyRequest, cookies }; } return render.verifyRequest(); case "error": if (pages.error) { return { redirect: `${pages.error}${pages.error.includes("?") ? "&" : "?"}error=${error}`, cookies }; } if (["Signin", "OAuthSignin", "OAuthCallback", "OAuthCreateAccount", "EmailCreateAccount", "Callback", "OAuthAccountNotLinked", "EmailSignin", "CredentialsSignin", "SessionRequired"].includes(error)) { return { redirect: `${options.url}/signin?error=${error}`, cookies }; } return render.error({ error: error }); default: } } else if (req.method === "POST") { switch (action) { case "signin": if (options.csrfTokenVerified && options.provider) { const signin = await routes.signin({ query: req.query, body: req.body, options }); if (signin.cookies) cookies.push(...signin.cookies); return { ...signin, cookies }; } return { redirect: `${options.url}/signin?csrf=true`, cookies }; case "signout": if (options.csrfTokenVerified) { const signout = await routes.signout({ options, sessionStore }); if (signout.cookies) cookies.push(...signout.cookies); return { ...signout, cookies }; } return { redirect: `${options.url}/signout?csrf=true`, cookies }; case "callback": if (options.provider) { if (options.provider.type === "credentials" && !options.csrfTokenVerified) { return { redirect: `${options.url}/signin?csrf=true`, cookies }; } const callback = await routes.callback({ body: req.body, query: req.query, method: req.method, headers: req.headers, cookies: req.cookies, options, sessionStore }); if (callback.cookies) cookies.push(...callback.cookies); return { ...callback, cookies }; } break; case "_log": if (userOptions.logger) { try { var _req$body3; const { code, level, ...metadata } = (_req$body3 = req.body) !== null && _req$body3 !== void 0 ? _req$body3 : {}; _logger.default[level](code, metadata); } catch (error) { _logger.default.error("LOGGER_ERROR", error); } } return {}; default: } } return { status: 400, body: `Error: Action ${action} with HTTP ${req.method} is not supported by NextAuth.js` }; }