@auth/core
Version:
Authentication for the Web.
97 lines (96 loc) • 3.83 kB
JavaScript
import { setLogger } from "./logger.js";
/**
* Set default env variables on the config object
* @param suppressWarnings intended for framework authors.
*/
export function setEnvDefaults(envObject, config, suppressBasePathWarning = false) {
try {
const url = envObject.AUTH_URL;
if (url) {
if (config.basePath) {
if (!suppressBasePathWarning) {
const logger = setLogger(config);
logger.warn("env-url-basepath-redundant");
}
}
else {
config.basePath = new URL(url).pathname;
}
}
}
catch {
// Catching and swallowing potential URL parsing errors, we'll fall
// back to `/auth` below.
}
finally {
config.basePath ?? (config.basePath = `/auth`);
}
if (!config.secret?.length) {
config.secret = [];
const secret = envObject.AUTH_SECRET;
if (secret)
config.secret.push(secret);
for (const i of [1, 2, 3]) {
const secret = envObject[`AUTH_SECRET_${i}`];
if (secret)
config.secret.unshift(secret);
}
}
config.redirectProxyUrl ?? (config.redirectProxyUrl = envObject.AUTH_REDIRECT_PROXY_URL);
config.trustHost ?? (config.trustHost = !!(envObject.AUTH_URL ??
envObject.AUTH_TRUST_HOST ??
envObject.VERCEL ??
envObject.CF_PAGES ??
envObject.NODE_ENV !== "production"));
config.providers = config.providers.map((provider) => {
const { id } = typeof provider === "function" ? provider({}) : provider;
const ID = id.toUpperCase().replace(/-/g, "_");
const clientId = envObject[`AUTH_${ID}_ID`];
const clientSecret = envObject[`AUTH_${ID}_SECRET`];
const issuer = envObject[`AUTH_${ID}_ISSUER`];
const apiKey = envObject[`AUTH_${ID}_KEY`];
const finalProvider = typeof provider === "function"
? provider({ clientId, clientSecret, issuer, apiKey })
: provider;
if (finalProvider.type === "oauth" || finalProvider.type === "oidc") {
finalProvider.clientId ?? (finalProvider.clientId = clientId);
finalProvider.clientSecret ?? (finalProvider.clientSecret = clientSecret);
finalProvider.issuer ?? (finalProvider.issuer = issuer);
}
else if (finalProvider.type === "email") {
finalProvider.apiKey ?? (finalProvider.apiKey = apiKey);
}
return finalProvider;
});
}
export function createActionURL(action, protocol, headers, envObject, config) {
const basePath = config?.basePath;
const envUrl = envObject.AUTH_URL ?? envObject.NEXTAUTH_URL;
let url;
if (envUrl) {
url = new URL(envUrl);
if (basePath && basePath !== "/" && url.pathname !== "/") {
if (url.pathname !== basePath) {
const logger = setLogger(config);
logger.warn("env-url-basepath-mismatch");
}
url.pathname = "/";
}
}
else {
const detectedHost = headers.get("x-forwarded-host") ?? headers.get("host");
const detectedProtocol = headers.get("x-forwarded-proto") ?? protocol ?? "https";
const _protocol = detectedProtocol.endsWith(":")
? detectedProtocol
: detectedProtocol + ":";
url = new URL(`${_protocol}//${detectedHost}`);
}
// remove trailing slash
const sanitizedUrl = url.toString().replace(/\/$/, "");
if (basePath) {
// remove leading and trailing slash
const sanitizedBasePath = basePath?.replace(/(^\/|\/$)/g, "") ?? "";
return new URL(`${sanitizedUrl}/${sanitizedBasePath}/${action}`);
}
return new URL(`${sanitizedUrl}/${action}`);
}