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
JavaScript
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);
}
}