better-auth
Version:
The most comprehensive authentication framework for TypeScript.
66 lines (64 loc) • 2.61 kB
JavaScript
import { parseSetCookieHeader } from "../../cookies/cookie-utils.mjs";
import "../../cookies/index.mjs";
import { serializeSignedCookie } from "better-call";
import { createAuthMiddleware } from "@better-auth/core/api";
import { createHMAC } from "@better-auth/utils/hmac";
//#region src/plugins/bearer/index.ts
/**
* Converts bearer token to session cookie
*/
const bearer = (options) => {
return {
id: "bearer",
hooks: {
before: [{
matcher(context) {
return Boolean(context.request?.headers.get("authorization") || context.headers?.get("authorization"));
},
handler: createAuthMiddleware(async (c) => {
const token = c.request?.headers.get("authorization")?.replace("Bearer ", "") || c.headers?.get("Authorization")?.replace("Bearer ", "");
if (!token) return;
let signedToken = "";
if (token.includes(".")) signedToken = token.replace("=", "");
else {
if (options?.requireSignature) return;
signedToken = (await serializeSignedCookie("", token, c.context.secret)).replace("=", "");
}
try {
const decodedToken = decodeURIComponent(signedToken);
if (!await createHMAC("SHA-256", "base64urlnopad").verify(c.context.secret, decodedToken.split(".")[0], decodedToken.split(".")[1])) return;
} catch {
return;
}
const existingHeaders = c.request?.headers || c.headers;
const headers = new Headers({ ...Object.fromEntries(existingHeaders?.entries()) });
headers.append("cookie", `${c.context.authCookies.sessionToken.name}=${signedToken}`);
return { context: { headers } };
})
}],
after: [{
matcher(context) {
return true;
},
handler: createAuthMiddleware(async (ctx) => {
const setCookie = ctx.context.responseHeaders?.get("set-cookie");
if (!setCookie) return;
const parsedCookies = parseSetCookieHeader(setCookie);
const cookieName = ctx.context.authCookies.sessionToken.name;
const sessionCookie = parsedCookies.get(cookieName);
if (!sessionCookie || !sessionCookie.value || sessionCookie["max-age"] === 0) return;
const token = sessionCookie.value;
const exposedHeaders = ctx.context.responseHeaders?.get("access-control-expose-headers") || "";
const headersSet = new Set(exposedHeaders.split(",").map((header) => header.trim()).filter(Boolean));
headersSet.add("set-auth-token");
ctx.setHeader("set-auth-token", token);
ctx.setHeader("Access-Control-Expose-Headers", Array.from(headersSet).join(", "));
})
}]
},
options
};
};
//#endregion
export { bearer };
//# sourceMappingURL=index.mjs.map