singularity-forge/web/lib/auth-guard.ts

45 lines
1.3 KiB
TypeScript
Raw Permalink Normal View History

// SF Web — Inline auth token verification for sensitive API routes
// Copyright (c) 2026 Jeremy McSpadden <jeremy@fluxlabs.net>
/**
* Defense-in-depth auth check for critical API routes (shutdown, update, etc.).
*
* The primary auth gate is Next.js middleware (web/middleware.ts). This helper
* provides a second layer so that even if middleware is misconfigured or
* bypassed, sensitive endpoints still reject unauthenticated requests.
*
* Returns a 401 Response if the token is missing or invalid, or null if auth
* passes (or no token is configured).
*/
export function verifyAuthToken(request: Request): Response | null {
2026-05-05 14:31:16 +02:00
const expectedToken = process.env.SF_WEB_AUTH_TOKEN;
if (!expectedToken) {
// No token configured (e.g. dev mode) — allow through
return null;
}
2026-05-05 14:31:16 +02:00
let token: string | null = null;
2026-05-05 14:31:16 +02:00
// 1. Authorization header (preferred)
const authHeader = request.headers.get("authorization");
if (authHeader?.startsWith("Bearer ")) {
token = authHeader.slice(7);
}
2026-05-05 14:31:16 +02:00
// 2. Query parameter fallback for EventSource / sendBeacon
if (!token) {
try {
const url = new URL(request.url);
token = url.searchParams.get("_token");
} catch {
// Malformed URL — reject
}
}
2026-05-05 14:31:16 +02:00
if (!token || token !== expectedToken) {
return Response.json({ error: "Unauthorized" }, { status: 401 });
}
2026-05-05 14:31:16 +02:00
return null;
}