Skip to content

Architecture d'Authentification - Yin Shi

Vue d'ensemble

L'application utilise Firebase UI Auth qui gère automatiquement toutes les méthodes d'authentification (email/password, Google SSO, Apple SSO).

Flux d'authentification unifié

1. Interface utilisateur

  • AuthScreen : Utilise SignInScreen de Firebase UI Auth
  • Gère automatiquement :
  • Inscription email/password
  • Connexion email/password
  • Connexion Google
  • Connexion Apple

2. Gestion de l'état

  • AuthentificationProvider : Provider principal qui écoute authStateChanges
  • Un seul point d'entrée : Le listener authStateChanges (ligne 25)

3. Workflow unifié pour TOUS les types d'authentification

┌─────────────────────────────────────────────────────────────┐
│  Firebase UI Auth (email/password, Google, Apple)           │
└─────────────────────┬───────────────────────────────────────┘
                      │
                      ▼
┌─────────────────────────────────────────────────────────────┐
│  Firebase Auth (authentification réussie)                   │
└─────────────────────┬───────────────────────────────────────┘
                      │
                      ▼
┌─────────────────────────────────────────────────────────────┐
│  authStateChanges.listen() dans AuthentificationProvider    │
│  (ligne 25 de auth_provider.dart)                           │
└─────────────────────┬───────────────────────────────────────┘
                      │
                      ▼
┌─────────────────────────────────────────────────────────────┐
│  getUserProfile(uid)                                         │
│  Vérifie si le profil Firestore existe                      │
└─────────────────────┬───────────────────────────────────────┘
                      │
        ┌─────────────┴─────────────┐
        │                           │
        ▼                           ▼
   Profil existe              Profil n'existe pas
        │                           │
        │                           ▼
        │              ┌────────────────────────────┐
        │              │ createUserProfile()        │
        │              │ (première connexion)       │
        │              └────────────┬───────────────┘
        │                           │
        └─────────────┬─────────────┘
                      │
                      ▼
┌─────────────────────────────────────────────────────────────┐
│  updateLastLogin(uid)                                        │
│  Met à jour la date de dernière connexion                   │
└─────────────────────┬───────────────────────────────────────┘
                      │
                      ▼
┌─────────────────────────────────────────────────────────────┐
│  _currentUser = profile                                      │
│  notifyListeners()                                           │
└─────────────────────────────────────────────────────────────┘

Avantages de cette architecture

Un seul point de vérité : authStateChanges gère tout ✅ Pas de duplication : La logique de création de profil est centralisée ✅ Cohérence : Tous les types d'authentification suivent le même flux ✅ Simplicité : Firebase UI Auth gère l'UI et la validation ✅ Idempotence : createUserProfile() vérifie si le profil existe avant de le créer

Fichiers principaux

lib/screens/auth_screen.dart

  • Interface d'authentification utilisant Firebase UI Auth
  • Configure les providers (Email, Google, Apple)

lib/providers/auth_provider.dart

  • Écoute authStateChanges pour détecter les changements d'état
  • Crée/récupère le profil Firestore automatiquement
  • Expose currentUser à toute l'application via Provider

lib/services/auth_service.dart

  • Wrapper autour de FirebaseAuth
  • Expose authStateChanges et currentUser
  • Gère la déconnexion et la suppression de compte

lib/services/user_service.dart

  • CRUD pour les profils utilisateurs dans Firestore
  • createUserProfile() est idempotent (vérifie l'existence avant création)

Notes importantes

⚠️ Les méthodes signIn() et signUp() dans AuthentificationProvider ne sont pas utilisées car Firebase UI Auth gère tout automatiquement.

⚠️ La création du profil Firestore se fait automatiquement lors de la première connexion, quel que soit le type d'authentification.

⚠️ lastLoginDate est mis à jour à chaque connexion pour tous les utilisateurs.


Configuration de la signature Android et OAuth

Pour que l'authentification Google (SSO) fonctionne correctement, vous devez configurer trois types d'empreintes dans Firebase et Google Cloud Platform :

1. Empreintes de débogage (Debug)

Quand est-ce utilisé ? - Pendant le développement local avec flutter run - Lors des tests sur des appareils de développement

Comment l'obtenir ?

keytool -list -v -keystore ~/.android/debug.keystore -alias androiddebugkey -storepass android -keypass android

2. Empreintes de production (Release)

Quand est-ce utilisé ? - Pour les builds release locaux (flutter build apk --release) - Pour les builds CI/CD qui ne passent pas par le Play Store

Comment l'obtenir ?

keytool -list -v -keystore android/upload-keystore.jks -alias upload -storepass VOTRE_MDP -keypass VOTRE_MDP

3. Empreintes Play App Signing (Obligatoire pour le Play Store)

Quand est-ce utilisé ? - Pour les applications téléchargées depuis le Play Store - Important : Même si vous utilisez votre propre clé de signature, Google génère une empreinte différente

Comment l'obtenir ? 1. Allez sur Play Console 2. Sélectionnez votre application 3. ConfigurationIntégrité de l'application 4. Section "Certificat de clé de signature d'application" 5. Copiez les empreintes SHA-1 et SHA-256

Configuration requise

  1. Firebase Console
  2. Allez dans votre projet Firebase
  3. Paramètres du projetApplications → votre app Android
  4. Ajoutez les trois types d'empreintes (Debug, Release, Play App Signing)
  5. Téléchargez le nouveau google-services.json

  6. Google Cloud Platform

  7. Allez sur Google Cloud Console
  8. Sélectionnez votre projet
  9. APIs & ServicesIdentifiants
  10. Modifiez l'ID client OAuth Android
  11. Ajoutez les trois empreintes SHA-1

  12. Vérification

  13. Testez l'authentification dans les trois scénarios :
    • En mode debug
    • Avec un APK release signé localement
    • Avec une version téléchargée depuis le Play Store