| import { createHmac, timingSafeEqual } from "crypto"; |
|
|
| |
| |
| |
| |
| |
| |
| |
| export function checkApiKey(req: Request): string | null { |
| const expected = process.env.REEL_API_KEY; |
|
|
| |
| if (!expected) return "REEL_API_KEY is not configured on the server"; |
|
|
| const provided = |
| req.headers.get("x-api-key") || |
| req.headers.get("authorization")?.replace(/^Bearer\s+/i, "") || |
| ""; |
|
|
| if (!provided) return "Missing x-api-key header"; |
| if (!safeEqual(provided, expected)) return "Invalid API key"; |
|
|
| return null; |
| } |
|
|
| |
| |
| function safeEqual(a: string, b: string): boolean { |
| const key = "reel-api-key-compare"; |
| const ha = createHmac("sha256", key).update(a).digest(); |
| const hb = createHmac("sha256", key).update(b).digest(); |
| return timingSafeEqual(ha, hb); |
| } |
|
|