06.05 — isAuthorized.ts#
Fichier source :
lib/isAuthorized.tsVérifie qu’une requête contient le bon
x-api-key.
Code#
import type { NextRequest } from "next/server";
const API_SECRET = process.env.API_SECRET;
function isAuthorized(request: NextRequest): boolean {
if (typeof API_SECRET !== "string") {
console.error("[CONFIG ERROR] API_SECRET is not defined");
return false;
}
const { searchParams } = new URL(request.url);
const apiKey = searchParams.get("apiKey") ?? request.headers.get("x-api-key");
return apiKey === API_SECRET;
}
export default isAuthorized;Approche#
1. API_SECRET#
const API_SECRET = process.env.API_SECRET;Lu une seule fois, au démarrage du worker Edge (cold start).
Stocké en tant que variable de module.
Plus rapide que process.env.API_SECRET à chaque appel.
2. Guard typeof !== "string"#
if (typeof API_SECRET !== "string") {
console.error("[CONFIG ERROR] API_SECRET is not defined");
return false;
}Si la variable d’environnement n’est pas définie : log + refuse.
Pas de panic au démarrage.
Comportement « fail-safe » : on refuse l’auth, un attaquant ne peut pas exploiter l’absence de variable d’environnement.
3. Passage de la clé#
const apiKey = searchParams.get("apiKey") ?? request.headers.get("x-api-key");- Query string
?apiKey=<X>. - Header
x-api-key: <X>(fallback).
| Cas | Endroit |
|---|---|
| cURL | Query string (plus simple, pas besoin de -H) |
| Production / browser fetch | Header (best practice, n’apparaît pas dans les logs serveur) |
Le README documente les deux :
curl -H "x-api-key: SECRET" "https://.../api/otp"
curl "https://.../api/otp?apiKey=SECRET" # même choseExport/import#
export default isAuthorized;import isAuthorized from "../lib/isAuthorized";Absence de rate-limit#
Aucun rate-limit n’est appliqué.
Un attaquant avec le bon API_SECRET pourrait spammer.
Mais : il faut déjà connaître API_SECRET.
Et le déploiement Vercel Free Tier a des limites built-in (100 requêtes/seconde par défaut).
Donc le rate-limit applicatif n’est pas indispensable.
console.error#
console.error("[CONFIG ERROR] API_SECRET is not defined");Tout console.* dans une Edge Function apparaît dans le dashboard de Vercel (logs).
Si API_SECRET n’est pas défini, le maintainer le voit dans les logs.