UNPKG

next-auth

Version:

Authentication for Next.js

164 lines (132 loc) 3.69 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.set = set; exports.defaultCookies = defaultCookies; function set(res, name, value, options = {}) { const stringValue = typeof value === 'object' ? 'j:' + JSON.stringify(value) : String(value); if ('maxAge' in options) { options.expires = new Date(Date.now() + options.maxAge); options.maxAge /= 1000; } let setCookieHeader = res.getHeader('Set-Cookie') || []; if (!Array.isArray(setCookieHeader)) { setCookieHeader = [setCookieHeader]; } setCookieHeader.push(_serialize(name, String(stringValue), options)); res.setHeader('Set-Cookie', setCookieHeader); } function _serialize(name, val, options) { const fieldContentRegExp = /^[\u0009\u0020-\u007e\u0080-\u00ff]+$/; const opt = options || {}; const enc = opt.encode || encodeURIComponent; if (typeof enc !== 'function') { throw new TypeError('option encode is invalid'); } if (!fieldContentRegExp.test(name)) { throw new TypeError('argument name is invalid'); } const value = enc(val); if (value && !fieldContentRegExp.test(value)) { throw new TypeError('argument val is invalid'); } let str = name + '=' + value; if (opt.maxAge != null) { const maxAge = opt.maxAge - 0; if (isNaN(maxAge) || !isFinite(maxAge)) { throw new TypeError('option maxAge is invalid'); } str += '; Max-Age=' + Math.floor(maxAge); } if (opt.domain) { if (!fieldContentRegExp.test(opt.domain)) { throw new TypeError('option domain is invalid'); } str += '; Domain=' + opt.domain; } if (opt.path) { if (!fieldContentRegExp.test(opt.path)) { throw new TypeError('option path is invalid'); } str += '; Path=' + opt.path; } else { str += '; Path=/'; } if (opt.expires) { let expires = opt.expires; if (typeof opt.expires.toUTCString === 'function') { expires = opt.expires.toUTCString(); } else { const dateExpires = new Date(opt.expires); expires = dateExpires.toUTCString(); } str += '; Expires=' + expires; } if (opt.httpOnly) { str += '; HttpOnly'; } if (opt.secure) { str += '; Secure'; } if (opt.sameSite) { const sameSite = typeof opt.sameSite === 'string' ? opt.sameSite.toLowerCase() : opt.sameSite; switch (sameSite) { case true: str += '; SameSite=Strict'; break; case 'lax': str += '; SameSite=Lax'; break; case 'strict': str += '; SameSite=Strict'; break; case 'none': str += '; SameSite=None'; break; default: throw new TypeError('option sameSite is invalid'); } } return str; } function defaultCookies(useSecureCookies) { const cookiePrefix = useSecureCookies ? '__Secure-' : ''; return { sessionToken: { name: `${cookiePrefix}next-auth.session-token`, options: { httpOnly: true, sameSite: 'lax', path: '/', secure: useSecureCookies } }, callbackUrl: { name: `${cookiePrefix}next-auth.callback-url`, options: { sameSite: 'lax', path: '/', secure: useSecureCookies } }, csrfToken: { name: `${useSecureCookies ? '__Host-' : ''}next-auth.csrf-token`, options: { httpOnly: true, sameSite: 'lax', path: '/', secure: useSecureCookies } }, pkceCodeVerifier: { name: `${cookiePrefix}next-auth.pkce.code_verifier`, options: { httpOnly: true, sameSite: 'lax', path: '/', secure: useSecureCookies } } }; }