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: UtiliseSignInScreende 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 écouteauthStateChanges- 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
authStateChangespour 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
authStateChangesetcurrentUser - 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. Configuration → Intégrité de l'application
4. Section "Certificat de clé de signature d'application"
5. Copiez les empreintes SHA-1 et SHA-256
Configuration requise
- Firebase Console
- Allez dans votre projet Firebase
Paramètres du projet→Applications→ votre app Android- Ajoutez les trois types d'empreintes (Debug, Release, Play App Signing)
-
Téléchargez le nouveau
google-services.json -
Google Cloud Platform
- Allez sur Google Cloud Console
- Sélectionnez votre projet
APIs & Services→Identifiants- Modifiez l'ID client OAuth Android
-
Ajoutez les trois empreintes SHA-1
-
Vérification
- 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