WakaStart
Utilisation de l'API

Utilisation de l'API — Headers & Rate Limits

Headers requis et optionnels, idempotence, CORS, rate limiting et backoff exponentiel.

Version v1.04 min de lecture

Utilisation de l'API — Headers & Rate Limits

Ce chapitre couvre les headers HTTP, les règles CORS et le throttling. Lisez Conventions REST d'abord.


Headers requis

Appels frontend (Bearer + enriched)

http
Authorization: Bearer <keycloak_access_token> x-enriched-token: <wakastart_token> Content-Type: application/json

Appels backend (API Key)

http
x-api-key: sk_live_... Content-Type: application/json

Headers optionnels

HeaderDescription
x-trace-idUUID de trace pour le debugging. Propagé dans les logs et les réponses.
x-request-idIdentifiant de requête (auto-généré si absent). Visible dans les réponses x-request-id.
Accept-LanguageLangue préférée pour les messages d'erreur (fr, en).

Exemple avec trace ID :

typescript
const traceId = crypto.randomUUID(); const response = await fetch(apiUrl, { headers: { "Authorization": `Bearer ${accessToken}`, "x-enriched-token": enrichedToken, "x-trace-id": traceId, "Content-Type": "application/json", }, }); // Le request-id est dans la réponse pour le support const requestId = response.headers.get("x-request-id");

CORS

L'API WakaStart supporte CORS pour les origines enregistrées. Les règles :

  • Origines autorisées : configurées dans ALLOWED_ORIGINS côté API.
  • Credentials : Access-Control-Allow-Credentials: true — les cookies HttpOnly sont transmis.
  • Méthodes : GET, POST, PUT, PATCH, DELETE, OPTIONS.
  • Headers exposés : x-request-id, Retry-After.

Appels directs depuis le browser : si votre frontend appelle l'API sans proxy, le cookie wakastart_token est HttpOnly et inaccessible depuis JavaScript. Vous ne pouvez pas passer x-enriched-token côté browser sans proxy. Utilisez toujours un proxy serveur.


Idempotence

Les opérations GET, PUT et DELETE sont idempotentes. Pour POST :

  • Création d'invitation : si une invitation PENDING existe déjà pour le même email + Customer, l'API répond 409 Conflict. C'est sûr de retenter après un échec réseau.
  • Enrichissement : /api/auth/enrich est idempotent pour un même access_token dans sa période de validité.
  • Token refresh : /api/auth/token/refresh génère un nouveau token à chaque appel. Ne pas appeler en parallèle.

Rate limiting

L'API applique trois niveaux de throttling :

NiveauTTLLimiteDescription
Court1 000 ms10 reqAnti-burst immédiat
Moyen60 000 ms100 reqLimite minute
Long3 600 000 ms1 000 reqLimite heure

Limites spécifiques par endpoint

EndpointLimite
POST /discover/start-login5/s · 20/10s · 100/60s
POST /api/auth/enrich5/min
POST /api/auth/logout10/min
POST /api/auth/token/refresh30/min
GET /api/invitations/verify/:token10/min/IP
POST /api/invitations/accept/:token5/min/IP
POST /api/mcp10/min

Réponse 429 :

json
{ "statusCode": 429, "message": "Too Many Requests" }

Le header Retry-After indique la durée d'attente en secondes.


Backoff exponentiel

typescript
async function fetchWithRetry( url: string, options: RequestInit, maxRetries = 3 ): Promise<Response> { for (let attempt = 0; attempt < maxRetries; attempt++) { const res = await fetch(url, options); if (res.status !== 429) return res; const retryAfter = parseInt(res.headers.get("Retry-After") ?? "1", 10); const delay = retryAfter * 1000 * Math.pow(2, attempt); await new Promise(r => setTimeout(r, delay)); } throw new Error("Rate limit exceeded after retries"); }

Vérification de droits depuis votre backend

http
POST /api/token/authorize x-api-key: sk_live_... Content-Type: application/json { "token": "eyJ...", "checks": { "adminLevel": { "requiredLevel": "CustomerAdmin" }, "roles": { "roles": ["CONFIG"], "mode": "any" }, "appRights": { "rights": ["users.create"], "mode": "all" } } }
json
{ "authorized": true, "details": { "adminLevel": { "hasLevel": true, "actualLevel": "NetworkAdmin" }, "roles": { "hasRoles": true, "matchedRoles": ["CONFIG"] }, "appRights": { "hasRights": true, "missingRights": [] } } }

Bonnes pratiques

  • Headers ne se cumulent pas : un appel avec x-api-key ET Authorization: Bearer verra la clé API prévaloir.
  • Toujours propager x-trace-id : indispensable pour le support en cas d'erreur 5xx.
  • Logger le x-request-id de la réponse sur les erreurs 5xx.
  • Respecter Retry-After : ne pas ignorer ce header, il protège la stabilité de l'API.

Pièges classiques

  • Appels parallèles au refresh : si plusieurs requêtes expirent en même temps et tentent toutes un refresh simultané, une seule réussit. Implémenter un mutex côté client.
  • Rate limit sur les tests : en CI, une batterie de tests peut déclencher le rate limit de courte durée. Ajouter des délais entre les tests d'intégration.

Aller plus loin