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)
httpAuthorization: Bearer <keycloak_access_token> x-enriched-token: <wakastart_token> Content-Type: application/json
Appels backend (API Key)
httpx-api-key: sk_live_... Content-Type: application/json
Headers optionnels
| Header | Description |
|---|---|
x-trace-id | UUID de trace pour le debugging. Propagé dans les logs et les réponses. |
x-request-id | Identifiant de requête (auto-généré si absent). Visible dans les réponses x-request-id. |
Accept-Language | Langue préférée pour les messages d'erreur (fr, en). |
Exemple avec trace ID :
typescriptconst 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_ORIGINScô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_tokenestHttpOnlyet inaccessible depuis JavaScript. Vous ne pouvez pas passerx-enriched-tokencô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
PENDINGexiste déjà pour le même email + Customer, l'API répond409 Conflict. C'est sûr de retenter après un échec réseau. - Enrichissement :
/api/auth/enrichest idempotent pour un même access_token dans sa période de validité. - Token refresh :
/api/auth/token/refreshgénère un nouveau token à chaque appel. Ne pas appeler en parallèle.
Rate limiting
L'API applique trois niveaux de throttling :
| Niveau | TTL | Limite | Description |
|---|---|---|---|
| Court | 1 000 ms | 10 req | Anti-burst immédiat |
| Moyen | 60 000 ms | 100 req | Limite minute |
| Long | 3 600 000 ms | 1 000 req | Limite heure |
Limites spécifiques par endpoint
| Endpoint | Limite |
|---|---|
POST /discover/start-login | 5/s · 20/10s · 100/60s |
POST /api/auth/enrich | 5/min |
POST /api/auth/logout | 10/min |
POST /api/auth/token/refresh | 30/min |
GET /api/invitations/verify/:token | 10/min/IP |
POST /api/invitations/accept/:token | 5/min/IP |
POST /api/mcp | 10/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
typescriptasync 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
httpPOST /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-keyETAuthorization: Bearerverra la clé API prévaloir. - Toujours propager
x-trace-id: indispensable pour le support en cas d'erreur 5xx. - Logger le
x-request-idde 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
- Erreurs HTTP : codes
429et401détaillés - Bonnes pratiques sécurité : tokens, secrets, HTTPS