UNPKG

next-firebase-auth-edge

Version:

Next.js Firebase Authentication for Edge and server runtimes. Compatible with latest Next.js features.

62 lines (61 loc) 3.48 kB
import { InvalidTokenError, InvalidTokenReason } from '../../../auth/error.js'; import { debug } from '../../../debug/index.js'; import { MultipleCookiesParser } from './MultipleCookiesParser.js'; import { ObjectCookiesProvider } from './ObjectCookiesProvider.js'; import { RequestCookiesProvider } from './RequestCookiesProvider.js'; import { SingleCookieParser } from './SingleCookieParser.js'; export class CookieParserFactory { static hasMultipleCookies(provider, cookieName) { return ['id', 'refresh', 'sig'] .map((it) => `${cookieName}.${it}`) .every((it) => Boolean(provider.get(it))); } static hasCustomTokenCookie(provider, cookieName) { return Boolean(provider.get(`${cookieName}.custom`)); } static hasLegacyMultipleCookies(provider, cookieName) { return (['custom', 'sig'] .map((it) => `${cookieName}.${it}`) .every((it) => Boolean(provider.get(it))) && provider.get(cookieName)?.includes(':')); } static getCompatibleProvider(legacyProvider, options) { const legacyToken = legacyProvider.get(options.cookieName); const [idToken, refreshToken] = legacyToken?.split(':') ?? []; const adaptedCookies = { [`${options.cookieName}.id`]: idToken, [`${options.cookieName}.refresh`]: refreshToken, [`${options.cookieName}.custom`]: legacyProvider.get(`${options.cookieName}.custom`), [`${options.cookieName}.sig`]: legacyProvider.get(`${options.cookieName}.sig`) }; return new ObjectCookiesProvider(adaptedCookies); } static fromProvider(provider, options) { const singleCookie = provider.get(options.cookieName); const hasLegacyCookie = singleCookie?.includes(':'); const enableMultipleCookies = CookieParserFactory.hasMultipleCookies(provider, options.cookieName); if (enableMultipleCookies) { return new MultipleCookiesParser(provider, options.cookieName, options.cookieSignatureKeys); } if (CookieParserFactory.hasLegacyMultipleCookies(provider, options.cookieName)) { return new MultipleCookiesParser(CookieParserFactory.getCompatibleProvider(provider, options), options.cookieName, options.cookieSignatureKeys); } if (hasLegacyCookie) { debug("Authentication cookie is in multiple cookie format, but lacks signature and custom cookies. Clear your browser cookies and try again. If the issue keeps happening and you're using `enableMultipleCookies` option, make sure that server returns all required cookies: https://next-firebase-auth-edge-docs.vercel.app/docs/usage/middleware#multiple-cookies"); throw new InvalidTokenError(InvalidTokenReason.INVALID_CREDENTIALS); } return new SingleCookieParser(provider, options.cookieName, options.cookieSignatureKeys); } static fromRequestCookies(cookies, options) { const provider = RequestCookiesProvider.fromRequestCookies(cookies); return CookieParserFactory.fromProvider(provider, options); } static fromHeaders(headers, options) { const provider = RequestCookiesProvider.fromHeaders(headers); return CookieParserFactory.fromProvider(provider, options); } static fromObject(cookies, options) { const provider = new ObjectCookiesProvider(cookies); return CookieParserFactory.fromProvider(provider, options); } }