Système d'Authentification - Firebase
Vue d'ensemble
Tranoo utilise Firebase Auth pour l'authentification des utilisateurs, avec une migration vers l'authentification par numéro de téléphone + mot de passe.
Stack technique
| Composant | Technologie | Version |
|---|---|---|
| Authentification | Firebase Auth | ^6.1.2 (Flutter), ^13.4.0 (Admin) |
| Notifications | Firebase Messaging | ^16.0.4 (Flutter), ^11.9.1 (Admin) |
| Stockage | Firebase Storage | ^13.0.4 |
| App Check | Firebase App Check | Sécurisation mobiles |
Architecture de l'authentification
Flux actuel (Phase 1 - Téléphone + MDP)
| Couche | Rôle |
|---|---|
| Utilisateur | Voit et saisit téléphone + MDP |
| Firebase Auth | Compte avec email synthétique + MDP |
| MongoDB | Profil métier : telephone, nom, prenoms, rôle |
| API | Vérifie verifyIdToken (inchangé) |
Email synthétique
Firebase nécessite un email unique. Pour l'authentification par téléphone, on utilise un email synthétique :
{indicatif}{numéro_national}@tranoo.app → Tranoo (acheteur)
pro_{indicatif}{numéro_national}@tranoo.app → Tranoo Pro (vendeur, livreur, …)
Exemples :
- Acheteur :
+229+97123456→22997123456@tranoo.app - Pro :
+229+97123456→pro_22997123456@tranoo.app
Séparation des rôles :
- Même numéro sur les deux apps = deux comptes Firebase distincts
- Pas de mélange de rôles
- Redirection appropriée (acheteur sur Tranoo, vendeur sur Pro)
Flux d'inscription
Étapes
-
Saisie utilisateur
- Nom, prénoms
- Téléphone (avec sélecteur de pays)
- Mot de passe (min. 8 caractères)
-
Validation mobile
- Validation longueur téléphone selon pays
- Validation mot de passe
-
Email synthétique
- Génération email depuis téléphone
syntheticEmailFromPhone(indicatif, numéro)
-
Firebase Auth
createUserWithEmailAndPassword(email synthétique, MDP)- Récupération
idToken
-
Backend API
POST /auth/register+ Bearer token- Création document MongoDB
- Enregistrement
telephoneréel +emailsynthétique
-
FCM Token
- Envoi token FCM pour notifications
Flux de connexion
Étapes
-
Saisie utilisateur
- Téléphone + Mot de passe
- Sélecteur de pays
-
Email synthétique
- Génération depuis téléphone
-
Firebase Auth
signInWithEmailAndPassword(email synthétique, MDP)- Récupération
idToken
-
Backend API
GET /protected/me+ Bearer token- Récupération profil MongoDB
Connexion legacy (anciens comptes email)
- Si la saisie contient
@, connexion email + MDP comme avant - Support des comptes existants sans forcer la migration
Mot de passe oublié
Flux OTP WhatsApp + FCM (actuel)
Endpoints : POST /api/push-otp/request, /verify-code, /reset-password
-
Saisie numéro
- Utilisateur saisit son numéro sur l'écran reset
-
Vérification BDD
- Backend vérifie que le numéro existe en base (
PasswordResetRequest)
- Backend vérifie que le numéro existe en base (
-
Envoi OTP
- Canal principal : OTP envoyé via WhatsApp Cloud API (template
tranoo_reset_code) - Fallback optionnel : notification push FCM si
RESET_FCM_FALLBACK=trueet token enregistré - Pas d'email utilisateur
- Canal principal : OTP envoyé via WhatsApp Cloud API (template
-
Validation OTP
- Utilisateur saisit OTP + nouveau mot de passe
- Backend valide OTP (durée courte, tentatives limitées via
authConfig.js)
-
Mise à jour
- Mise à jour Firebase Auth
- Nouveau MDP (min. 8 caractères)
Variables liées : OTP_LENGTH, OTP_TTL_MS, OTP_MAX_ATTEMPTS, WHATSAPP_OTP_TEMPLATE_NAME
Configuration
Mobile (Flutter)
Fichiers de configuration :
tranoo/lib/utils/auth_config.dart- MDP min 8, OTP 6 chiffres, nom app "Tranoo"tranoo_pro/lib/utils/auth_config.dart- Idem pour "Tranoo Pro"
Validation téléphone :
- Bénin : 8-10 chiffres
- Autres pays : selon indicatif
Backend (Node.js)
Fichier de configuration :
src/config/authConfig.js- OTP, MDP, session web 30 min
Surcharge .env :
- Variables environnement pour personnaliser
Web (Next.js)
Session web :
- Header
X-Web-Session-Id(UUID) - Header
X-Client-Platform: web - Durée : 30 minutes (configurable)
Sécurité
Firebase App Check
- Sécurisation des apps mobiles contre requêtes non autorisées
- Vérification via
verifyAppCheck.jsmiddleware
Rate Limiting
- Limitation sur endpoints d'authentification
- Protection contre brute force
authRateLimit.jsmiddleware
CAPTCHA
- Turnstile (Cloudflare) sur actions sensibles
verifyCaptcha.jsmiddleware- Protection contre bots
Validation
- Validation des entrées via Mongoose
- Validation côté mobile
- Validation côté backend
Rôles utilisateurs
Tranoo (acheteurs)
- Uniquement rôle
acheteur - Refus des rôles Pro sur cette app
Tranoo Pro
- Rôles acceptés :
vendeur,chauffeur,transitaire,livreur,agentCommercial,admin - Pas de rôle
acheteur
Phases de migration
Phase 1 - Actuelle (Rapide, sans migration comptes)
- Plus d'email visible à l'inscription/connexion
- Comportement stable pour nouveaux comptes
- Connexion legacy email pour anciens comptes
Phase 2 - Web + données affichées
- Login téléphone + MDP sur dashboard
- Colonnes tableaux : téléphone au lieu d'email
- Profils mobile : masquer champ email
Phase 3 - Optionnelle (JWT maison)
- Middleware
verifyJwtau lieu deverifyIdToken - Migration comptes existants
- Retrait possible de Firebase Auth
- FCM peut rester sans Firebase Auth
Configuration Firebase
Service Account
- Chargement depuis variable
FIREBASE_SERVICE_ACCOUNT_JSON - Fallback sur fichier
firebaseServiceAccountKey.json
Initialisation
admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
});
Voir aussi
- Architecture Backend — documentation backend complète
- Architecture Mobile — documentation Flutter
- Architecture Web — documentation Next.js
- Internationalisation — configuration i18n
- Sécurité — rate limiting, CAPTCHA, App Check