28 lines
932 B
TypeScript
28 lines
932 B
TypeScript
import "server-only";
|
|
|
|
import { timingSafeEqual } from "node:crypto";
|
|
|
|
export const PASCAL_INTERNAL_SECRET_HEADER = "x-pascal-proxy-secret";
|
|
|
|
function safeEqual(left: string, right: string) {
|
|
const leftBuffer = Buffer.from(left);
|
|
const rightBuffer = Buffer.from(right);
|
|
if (leftBuffer.length !== rightBuffer.length) return false;
|
|
return timingSafeEqual(leftBuffer, rightBuffer);
|
|
}
|
|
|
|
function bearerToken(request: Request) {
|
|
const authorization = request.headers.get("authorization") || "";
|
|
const match = authorization.match(/^Bearer\s+(.+)$/i);
|
|
return match?.[1]?.trim() || "";
|
|
}
|
|
|
|
export function isPascalInternalRequest(request: Request) {
|
|
const expected = String(process.env.PASCAL_PROXY_SECRET || "").trim();
|
|
if (!expected) return false;
|
|
const supplied =
|
|
request.headers.get(PASCAL_INTERNAL_SECRET_HEADER)?.trim() ||
|
|
bearerToken(request);
|
|
return Boolean(supplied) && safeEqual(supplied, expected);
|
|
}
|