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