5.3 KiB
5.3 KiB
ADR-008 : Authentification et Gestion d'Identité
Statut : Accepté Date : 2025-01-18
Contexte
RoadWave nécessite un système d'authentification sécurisé pour mobile (iOS/Android), scalable jusqu'à 10M utilisateurs, avec contraintes de coût réduit et conformité RGPD.
Exigence de souveraineté : En cohérence avec ADR-004 (CDN 100% français), les données d'authentification doivent être hébergées en France pour garantir une souveraineté totale.
Décision
Zitadel self-hosted sur OVH France pour l'IAM avec validation JWT locale côté API Go.
Architecture de déploiement :
- Container Docker sur le même VPS OVH (Gravelines, France) que l'API
- Base de données PostgreSQL partagée avec RoadWave (séparation logique par schéma)
- Aucune donnée d'authentification ne transite par des serveurs tiers
Alternatives considérées
| Solution | Coût (10M users) | Performance | Simplicité | Intégration Go |
|---|---|---|---|---|
| Zitadel | 200-500€/mois | Excellente | Élevée | SDK natif |
| Supabase Auth | 32K€/mois | Excellente | Élevée | REST API |
| Keycloak | 200-800€/mois | Bonne | Faible | Lib tierce |
| Auth0 | 50K€+/mois | Excellente | Élevée | SDK natif |
| JWT Custom | 0€ (dev) | Excellente | Moyenne | Natif |
Justification
- Souveraineté garantie : Self-hosting sur OVH France (Gravelines) = 100% des données en France, cohérent avec ADR-004
- Coût maîtrisé : 100x moins cher que Supabase/Auth0 à 10M users (pas de coût par utilisateur actif)
- Performance : JWT validation locale = 0 latence auth sur chaque requête API
- Stack alignée : Go + PostgreSQL + Redis (déjà dans RoadWave)
- Scalabilité prouvée : Clients avec 2.3M tenants, architecture event-sourced
- RGPD natif : Open source, contrôle total des données, DPA non nécessaire (pas de sous-traitant)
- Standards ouverts : OpenID Connect certifié (pas de vendor lock-in, migration facile si besoin)
Architecture
┌─────────────────┐
│ Mobile Apps │ OAuth2 PKCE + Refresh tokens
│ (iOS/Android) │
└────────┬────────┘
│ HTTPS
│
┌────▼─────────────────────────────────┐
│ OVH VPS Essential (Gravelines, FR) │
│ │
│ ┌─────────────────┐ │
│ │ Zitadel IdP │ Port 8081 │
│ │ (Docker) │ Self-hosted │
│ └────────┬────────┘ │
│ │ JWT token │
│ ┌────────▼────────┐ │
│ │ Go + Fiber API │ Port 8080 │
│ │ (RoadWave) │ Validation │
│ │ │ JWT locale │
│ └────────┬────────┘ │
│ │ │
│ ┌────────▼────────┐ │
│ │ PostgreSQL │ Schémas: │
│ │ + PostGIS │ - roadwave │
│ │ │ - zitadel │
│ └─────────────────┘ │
└───────────────────────────────────────┘
Données 100% hébergées en France (souveraineté totale)
Exemple d'intégration
import "github.com/zitadel/zitadel-go/v3/pkg/authorization/oauth"
// Validation JWT locale haute performance
verifier := oauth.WithJWT(config)
app.Use(verifier.Middleware())
// Accès aux claims
userID := ctx.Locals("sub").(string)
Conséquences
Positives
- ✅ Souveraineté totale : Données 100% en France (OVH Gravelines), contrôle complet
- ✅ Coût prévisible : Pas de surprise à la croissance (pas de facturation par utilisateur)
- ✅ Performance : Latence minimale (même VPS que l'API)
- ✅ Fonctionnalités avancées : MFA, passkeys, SSO disponibles gratuitement
- ✅ Conformité RGPD : Pas de DPA nécessaire (pas de sous-traitant externe)
- ✅ Standards ouverts : Migration facile vers autre solution si besoin
Négatives
- ❌ Maintenance : Nécessite monitoring et mises à jour régulières
- ❌ Complexité initiale : Configuration PostgreSQL schema partagé
- ❌ Backup : Responsabilité de sauvegarder les données utilisateurs
- ❌ Scaling : Migration Kubernetes nécessaire au-delà de 500K utilisateurs
Déploiement
- MVP (0-20K) : Docker sur VPS OVH Essential (coût inclus)
- Growth (20K-500K) : Même architecture, VPS plus puissant si besoin
- Scale (500K+) : Migration Kubernetes managé avec haute disponibilité
Coût Estimé
| Phase | Utilisateurs | Coût Zitadel/mois |
|---|---|---|
| MVP | 0-20K | 0€ (inclus VPS) |
| Growth | 20K-500K | 0€ (inclus VPS) |
| Scale | 500K+ | 50-100€ (instance K8s dédiée) |
Comparaison : Auth0 coûterait 50K€/mois pour 10M utilisateurs vs 100€/mois en self-hosted.