Principes
- Une clé par service / environnement. Pas une clé partagée entre dev et prod, ni entre microservices indépendants. Si une clé fuite, vous révoquez uniquement le service impacté.
- Scopes minimum. Un service qui ne fait que créer des PaymentIntents →
payment_intents:writeuniquement. Paspayouts:write. - IP allowlist pour les serveurs avec IP statique (AWS NAT, OVH, Hetzner).
- Rotation périodique : tous les 6-12 mois minimum.
- 2FA active sur le compte du membre qui gère les clés.
Stockage
| Type | Recommandation |
|---|---|
| Vercel / Netlify | Environment Variables (chiffrées au repos) |
| AWS | Secrets Manager ou Parameter Store (KMS encrypted) |
| GCP | Secret Manager |
| Self-hosted | HashiCorp Vault, sops, Doppler |
| Local dev | .env.local dans .gitignore, JAMAIS commiter |
- Révoquez immédiatement depuis le dashboard (TOTP requis)
- Créez une nouvelle clé
- Rotez dans tous vos environnements
- Si la fuite est publique (GitHub public), faites un
git filter-repopour purger l’historique, mais traitez d’abord la clé comme compromise
Format
sk_live_ ou sk_test_ suivi de 64 caractères hexadécimaux. Toute autre forme renvoie 401 Invalid API key.
Granularité avancée
Pour un setup avec backend multi-tenant (vous opérez plusieurs marchands IzichangePay), gérez une clé par tenant côté votre app et utilisez-la pour les appels à ce tenant. Pas de risque de cross-contamination.Les sessions dashboard sont indépendantes des clés API. Une fuite de clé n’expose pas votre compte au login dashboard : le mot de passe et la 2FA restent requis.
Audit
Chaque action de gestion (create, rotate, révoque, IP change) est tracée dans Paramètres → Audit log avec :- Qui (membre + IP)
- Quoi (action + ID de la clé)
- Quand (timestamp)
- Avant / après (pour les modifications)