06.05 — isAuthorized.ts#

Fichier source : lib/isAuthorized.ts

Vé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");
  1. Query string ?apiKey=<X>.
  2. Header x-api-key: <X> (fallback).
CasEndroit
cURLQuery string (plus simple, pas besoin de -H)
Production / browser fetchHeader (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 chose

Export/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.