Clés API, tokens et mandats d'accès : authentification sécurisée
Texte intégral de l'article
1) Pourquoi tout cela : un modèle de menace pour iGaming
L'argent et PII : компрометация de la clé → фрод, les fuites, les amendes.
Intégration réseau : des dizaines de fournisseurs externes, différentes régions/licences.
Taux SLA élevés : paiement simple ou double - risques juridiques et de réputation.
Conclusion : l'authentification et l'autorisation doivent être « sécurisées par défaut », avec un minimum de privilèges et une observabilité rigide.
2) Outils : Ce que nous avons dans l'arsenal
Clés API : ID client statiques. Intégration facile, risque élevé de fuites.
OAuth2 (Client Credentials) : tokens Bearer à courte vie avec scope/audience.
mTLS : vérification TLS réciproque, lien client fort avec le canal.
Signature HMAC/EdDSA : intégrité cryptographique du corps de requête et protection contre les répliques (timestamp + nonce).
Proof-of-Possession : MTLS-bound tokens ou DPoP (signature de la requête HTTP par la clé client).
JWT/PASETO : jetons auto-décrits (de préférence avec un court TTL).
RBAC/ABAC : autorisation de rôle/attribut-base (ORA/décisions de politique).
Mandats d'accès temporaire (delegation/STS) : billets limités dans le temps et les objectifs émis pour un scénario particulier.
3) Principes de base (« panneaux stop »)
1. Least Privilège : chaque clé/token est le minimum de droits possibles.
2. Short-lived by default : TTL par minutes, pas par jour. Rotation - automatique.
3. Bind to channel : lier des tokens à mTLS/DPoP ne sert → à rien en cas de fuite.
4. Per-brand/region : clés/certificats et autorisations - pour la marque/licence/region.
5. Pas de secrets partagés dans le code : secrets uniquement via Vault/HSM/KMS, ni dans Git/logs.
6. Audit WORM : logiques immuables de toutes les opérations/émissions/rotations.
7. L'idempotence sur les write-trames : toute répétition avec la même clé ne change pas l'argent une deuxième fois.
4) Quand utiliser quoi (iGaming contexte)
5) Conception des mandats d'accès (scopes, audience, conditions)
Scope-s (exemples) :- `bets:write`, `settlements:write`, `wallet:credit`, `wallet:debit`, `rg:read`, `rg:enforce`, `jackpot:trigger`.
Audience : à qui s'adresse le jeton (par exemple, 'aud : wallet. api`).
Constraints (fine-grained):- `brand_id`, `region`, `ip/cidr`, `time_of_day`, `rate_limit`, `max_amount`.
- Stocké dans un jeton (JWT claims) ou dans un « mandat » émis dans Vault/STS.
6) Flow de référence
6. 1 Plate-forme ⇄ RGS : argent par RPC
1. mTLS handshake (certificats per brand/region).
2. OAuth2 CC : RGS obtient 'access _ token' (TTL 2-5 min, 'aud = wallet. api`, `scope=bets:write settlements:write`).
3. Demande 'POST/v1/bets/authorize' avec les titres :- `Authorization: Bearer `, `X-Idempotency-Key`, `X-Trace-Id`. 
- 4. Réponse + entrée dans l'audit WORM (qui/quoi/quand/d'où).
- 5. La rotation du token est sans soudure, après l'expiration - répétition CC.
6. 2 Webhooks plate-forme → fournisseur
Titre « X-Signature : eddsa = 
Le fournisseur vérifie : la fenêtre de validation (± 5 min), le jetable 'nonce', la signature du corps.
En cas d'indisponibilité, return c backoff, dédup par 'event _ id'.
6. 3 Délégation (service jackpot → portefeuille)
JP appelle STS : « donne un jeton temporaire sur 'wallet : credit'pour 'player _ id = p _...', somme ≤ X, TTL 2 min ».
STS vérifie la stratégie/les limites → émet un mandat (token étroit).
JP prête un portefeuille avec ce jeton. Il est inutile de compromettre un tel token : TTL court, droits étroits, ancrage à mTLS.
7) Conceptions de demandes
7. 1 Idempotence (obligatoire)
POST /v1/bets/settle
Authorization: Bearer <MTLS-bound>
X-Idempotency-Key: settle_r_8c12_1
X-Trace-Id: tr_a1b2
{
"bet_id":"b_001",  "round_id":"r_8c12",  "win":{"amount":1460,"currency":"EUR"}
}
→ 200 { "status":"credited", "settlement_id":"st_77" }
(répétition avec la même clé → la même réponse)7. 2 Signature du Webhook (HMAC)
X-Signature: sha256=BASE64(HMAC(secret, timestamp + "." + nonce + "." + body))
X-Timestamp: 1730000000
X-Nonce: 1f7a...8) Gestion des secrets et des clés
Vault/HSM/KMS : génération, stockage, rotation, rappel.
Environnement : sandbox/prod - différentes racines de confiance.
Per brand/region : clés et certificats séparés.
Auto-rotation : cron/alertes ; périodes overlap pour les remplacements sans soudure.
Interdiction dans le code/logs : les secrets ne sont pas écrits dans stdout, ne tombent pas dans crash-reports.
Identité de l'appareil/Workload : SPIFFE/SPIRE, K8s ServiceAccount → mTLS sans secrets manuels.
9) Politiques d'autorisation (RBAC/ABAC) et OPA
RBAC: роли «rgs», «wallet», «jackpot», «reporting».
ABAC : règles "si 'region = EU' et" brand = A '→ permettre' wallet : credit '≤ 10k ".
OPA/REGO ou équivalents : prise de décision centralisée, versionage des politiques, tests à sec.
10) Observation et audit
« trace _ id'et » client _ id'dans chaque requête/événement.
Métriques : p50/p95/p99 latitude par endpoints, taux d'erreur par code ('AUTH _ FAILED', 'SCOPE _ DENIED', 'IDEMPOTENCY _ MISMATCH'), fréquence des rotations, proportion Tokens périmés.
Journal WORM : émissions/critiques de tokens, changement de clés, modification de stratégies.
Alert : sursaut 'AUTH _ FAILED', anomalies géo/ASN, croissance « tardive/révoquée »> seuil.
11) Résidence régionale et segmentation
Les tokens/certificats sont liés à la région (EU/UK/BR/...).
Dans les marques - « région », les passerelles de plateforme interdisent les appels croisés régionaux.
KMS et cluster Vault séparés par région ; les clés ne « roulent » pas entre les régions.
12) Incidents et rappels
Compromise playbook : clé/token revoke instantanée, bloc réseau/ASN, fermeture scope.
Kill-switch au niveau de la passerelle : « no new sessions/funds ».
Post mortem : « Comme il est arrivé dans les logs/référentiels », « pourquoi le DLP/scanner Secret n'a pas fonctionné ».
13) Chèques-feuilles
A. Pour la plateforme
- Tous les chemins d'écriture : mTLS + OAuth2 CC (TTL ≤ 5 min), "X-Idempotency-Key", "X-Trace-Id'.
- Webhooks : HMAC/EdDSA + timestamp + nonce, dedup par 'event _ id'.
- Keistor : Vault/HSM/KMS, rotation et rappel, séparation par marque/région.
- ORA/politiques : RBAC/ABAC, journaux de changement, tests.
- WORM audit et SLO dashboards (latency, error, revoke/rotate).
- DR/xaoc-exercice : jetons épuisés, échange de signature, MITM sans mTLS.
B. Pour le fournisseur (RGS/live/JP)
- Je ne garde pas de secrets dans le code ; J'utilise Vault/remplacement via des variables d'environnement.
- Rotation automatique des tokens ; handle 401/403 avec mise à jour.
- Je signe des webhooks/vérifie les fenêtres de validation et jetables.
- Je vérifie les actions clés et réagis aux titres Deprecation/Sunset.
- Idempotence sur tous les appels write, dedup par 'Idempotency-Key'.
14) Anti-modèles (drapeaux rouges)
Clés API statiques sans date d'expiration dans la vente.
Tokens Bearer sans liaison au canal (pas de MTLS/DPoP).
Gardez des secrets dans le Git/CI-loga/config frontende.
Clé/certificat partagé pour plusieurs marques/régions.
Webhooks sans signature et fenêtre temporelle → relier.
Aucun rappel centralisé et aucun journal WORM.
Manque d'idempotence → prises de débit/crédits.
15) Mini-modèles de politique (exemple, humain)
Mandat « rgs→wallet » (UE, marque A) :- `aud=wallet. api`, `scope=["bets:write","settlements:write"]`
- `constraints: region=EU, brand=A, ip in {asn:…}, max_amount=5000 EUR, ttl=300s`
- `binding: mTLS(cert_hash=sha256:…)`
- 'alg = Ed25519', la fenêtre '± 300s', 'nonce' est unique, le dedup 'event _ id' est de 24 heures.
L'authentification sécurisée dans iGaming est une combinaison de pratiques : mandats à courte durée de vie, ancrage de canal (mTLS/DPoP), scope/audience étroite, idempotence stricte, Vault/HSM et audit WORM, segmentation régionale et observabilité. Cette pile n'entrave pas la vitesse des intégrations, mais réduit radicalement le risque de fuites et d'incidents financiers - l'argent et les données restent sous contrôle, les mises à niveau passent de manière prévisible et la conformité est effectuée « hors de la boîte ».
