Aller au contenu principal

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​

ComposantTechnologieVersion
AuthentificationFirebase Auth^6.1.2 (Flutter), ^13.4.0 (Admin)
NotificationsFirebase Messaging^16.0.4 (Flutter), ^11.9.1 (Admin)
StockageFirebase Storage^13.0.4
App CheckFirebase App CheckSécurisation mobiles

Architecture de l'authentification​

Flux actuel (Phase 1 - Téléphone + MDP)​

CoucheRôle
UtilisateurVoit et saisit téléphone + MDP
Firebase AuthCompte avec email synthétique + MDP
MongoDBProfil métier : telephone, nom, prenoms, rôle
APIVé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​

  1. Saisie utilisateur

    • Nom, prénoms
    • Téléphone (avec sélecteur de pays)
    • Mot de passe (min. 8 caractères)
  2. Validation mobile

    • Validation longueur téléphone selon pays
    • Validation mot de passe
  3. Email synthétique

    • Génération email depuis téléphone
    • syntheticEmailFromPhone(indicatif, numéro)
  4. Firebase Auth

    • createUserWithEmailAndPassword(email synthétique, MDP)
    • Récupération idToken
  5. Backend API

    • POST /auth/register + Bearer token
    • Création document MongoDB
    • Enregistrement telephone réel + email synthétique
  6. FCM Token

    • Envoi token FCM pour notifications

Flux de connexion​

Étapes​

  1. Saisie utilisateur

    • Téléphone + Mot de passe
    • Sélecteur de pays
  2. Email synthétique

    • Génération depuis téléphone
  3. Firebase Auth

    • signInWithEmailAndPassword(email synthétique, MDP)
    • Récupération idToken
  4. 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

  1. Saisie numéro

    • Utilisateur saisit son numéro sur l'écran reset
  2. Vérification BDD

    • Backend vérifie que le numéro existe en base (PasswordResetRequest)
  3. Envoi OTP

    • Canal principal : OTP envoyé via WhatsApp Cloud API (template tranoo_reset_code)
    • Fallback optionnel : notification push FCM si RESET_FCM_FALLBACK=true et token enregistré
    • Pas d'email utilisateur
  4. Validation OTP

    • Utilisateur saisit OTP + nouveau mot de passe
    • Backend valide OTP (durée courte, tentatives limitées via authConfig.js)
  5. 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.js middleware

Rate Limiting​

  • Limitation sur endpoints d'authentification
  • Protection contre brute force
  • authRateLimit.js middleware

CAPTCHA​

  • Turnstile (Cloudflare) sur actions sensibles
  • verifyCaptcha.js middleware
  • 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 verifyJwt au lieu de verifyIdToken
  • 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​