UNPKG

next-firebase-auth-edge

Version:

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

76 lines (75 loc) 3.48 kB
import { CookieBuilderFactory } from './builder/CookieBuilderFactory.js'; import { MultipleCookieExpiration } from './expiration/MultipleCookieExpiration.js'; import { SingleCookieExpiration } from './expiration/SingleCookieExpiration.js'; import { CookieParserFactory } from './parser/CookieParserFactory.js'; import { CookieSetterFactory } from './setter/CookieSetterFactory.js'; import { NextApiResponseCookieSetter } from './setter/NextApiResponseHeadersCookieSetter.js'; export class AuthCookies { provider; options; builder; targetCookies = null; constructor(provider, options) { this.provider = provider; this.options = options; this.builder = CookieBuilderFactory.fromOptions(options); } shouldClearMultipleCookies() { return (!this.options.enableMultipleCookies && (CookieParserFactory.hasMultipleCookies(this.provider, this.options.cookieName) || CookieParserFactory.hasLegacyMultipleCookies(this.provider, this.options.cookieName))); } shouldClearCustomTokenCookie() { return (!this.options.enableCustomToken && CookieParserFactory.hasCustomTokenCookie(this.provider, this.options.cookieName)); } shouldClearSingleCookie() { const hasSingleCookie = Boolean(this.provider.get(this.options.cookieName)); return this.options.enableMultipleCookies && hasSingleCookie; } clearUnusedCookies(setter) { if (this.shouldClearMultipleCookies()) { const expiration = new MultipleCookieExpiration(this.options.cookieName, setter); expiration.expireCookies(this.options.cookieSerializeOptions); } else if (this.shouldClearCustomTokenCookie()) { const expiration = new MultipleCookieExpiration(this.options.cookieName, setter); expiration.expireCustomCookie(this.options.cookieSerializeOptions); } if (this.shouldClearSingleCookie()) { const expiration = new SingleCookieExpiration(this.options.cookieName, setter); expiration.expireCookies(this.options.cookieSerializeOptions); } } async getCookies(value) { const targetValue = this.options.enableCustomToken ? value : { idToken: value.idToken, refreshToken: value.refreshToken, metadata: value.metadata }; if (this.targetCookies) { return this.targetCookies; } return (this.targetCookies = await this.builder.buildCookies(targetValue)); } async setAuthCookies(value, requestCookies) { const cookies = await this.getCookies(value); const setter = CookieSetterFactory.fromRequestCookies(requestCookies); this.clearUnusedCookies(setter); setter.setCookies(cookies, this.options.cookieSerializeOptions); } async setAuthHeaders(value, headers) { const cookies = await this.getCookies(value); const setter = CookieSetterFactory.fromHeaders(headers); this.clearUnusedCookies(setter); setter.setCookies(cookies, this.options.cookieSerializeOptions); } async setAuthNextApiResponseHeaders(value, response) { const cookies = await this.getCookies(value); const setter = new NextApiResponseCookieSetter(response); this.clearUnusedCookies(setter); setter.setCookies(cookies, this.options.cookieSerializeOptions); } }