Skip to main content

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 + 9712345622997123456@tranoo.app
  • Pro : +229 + 97123456pro_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