📚 Recommandations Officielles Flutter & Firebase - Étape 5
đź“‹ Vue d'ensemble
Analyse des recommandations officielles Flutter et Firebase pour la protection des routes et l'authentification.
Sources consultées : - Flutter 3.35.5 (dernière version stable) - Firebase FlutterFire UI (dernière version) - Google Cloud Firestore Security Rules (2024-2025)
âś… Recommandations Officielles Flutter
1. Gestion de l'État d'Authentification
Source : Flutter State Management - Simple App State Management
Recommandation officielle :
- ✅ Utiliser le package provider pour la gestion d'état
- ✅ Utiliser Consumer<T> pour accéder à l'état
- ✅ Utiliser ChangeNotifier pour les modèles d'état
- ✅ Séparer l'état éphémère de l'état applicatif
Votre implémentation :
// âś… CONFORME
class AuthentificationProvider extends ChangeNotifier {
// État applicatif
AppUserModel? _currentUser;
bool _isInitializing = true;
// Getters
AppUserModel? get currentUser => _currentUser;
bool get isInitializing => _isInitializing;
}
// âś… CONFORME
Consumer<AuthentificationProvider>(
builder: (context, authProvider, _) {
// Accès à l'état
}
)
Verdict : âś… CONFORME AUX RECOMMANDATIONS
2. Navigation et Authentification
Source : FlutterFire UI - Navigation
Recommandation officielle :
- ✅ Utiliser StreamBuilder pour écouter les changements d'authentification
- ✅ Utiliser authStateChanges API pour l'état d'authentification
- ✅ Implémenter un wrapper pour la redirection conditionnelle
- ✅ Supporter les routes nommées (optionnel mais recommandé)
Votre implémentation :
// âś… CONFORME
StreamBuilder<User?>(
stream: AuthService().authStateChanges,
builder: (context, snapshot) {
final user = snapshot.data;
if (user == null) {
return const AuthScreen();
}
// Vérification conditionnelle
if (isOAuthUser || user.emailVerified) {
return const MainNavigation();
}
return const VerifyEmailScreen();
},
)
Verdict : âś… CONFORME AUX RECOMMANDATIONS
3. Sécurité et Protection des Routes
Source : Flutter Security
Recommandation officielle : - ✅ Implémenter une protection en couches (defense in depth) - ✅ Vérifier l'authentification à plusieurs niveaux - ✅ Utiliser des règles de sécurité backend (Firestore) - ✅ Valider les données côté client ET côté serveur
Votre implémentation :
Niveau 1 (App) : âś… AuthWrapper
Niveau 2 (Routes) : ❌ À implémenter
Niveau 3 (Écrans) : ❌ À implémenter
Niveau 4 (Backend) : ❌ À vérifier
Verdict : ⚠️ PARTIELLEMENT CONFORME - Manque les niveaux 2, 3, 4
âś… Recommandations Officielles Firebase
1. Firestore Security Rules - Authentification
Source : Firebase - Writing Conditions for Security Rules
Recommandation officielle :
// Vérifier que l'utilisateur est authentifié
allow read, write: if request.auth != null;
// Vérifier que l'utilisateur accède à ses propres données
allow read, update, delete: if request.auth != null && request.auth.uid == userId;
// Vérifier les données avant écriture
allow write: if request.resource.data.field == value;
Votre implémentation : - ❌ Pas de règles Firestore vérifiées - ❌ Pas de vérification d'authentification backend - ❌ Pas de validation de données backend
Verdict : ❌ NON CONFORME - À IMPLÉMENTER
2. Firestore Security Rules - Email Vérifié
Source : Firebase - Custom Claims and Email Verification
Recommandation officielle :
// Vérifier que l'utilisateur a un email vérifié
// Option 1 : Utiliser un champ dans Firestore
allow write: if request.auth != null &&
get(/databases/$(database)/documents/users/$(request.auth.uid)).data.emailVerified == true;
// Option 2 : Utiliser des custom claims (recommandé)
allow write: if request.auth != null &&
request.auth.token.email_verified == true;
Votre implémentation : - ❌ Pas de vérification d'email vérifié dans Firestore - ❌ Pas de custom claims configurés
Verdict : ❌ NON CONFORME - À IMPLÉMENTER
📊 Tableau Comparatif
| Aspect | Recommandation Officielle | Votre Implémentation | Statut |
|---|---|---|---|
| State Management (Provider) | ✅ Recommandé | ✅ Implémenté | ✅ OK |
| StreamBuilder | ✅ Recommandé | ✅ Implémenté | ✅ OK |
| authStateChanges API | ✅ Recommandé | ✅ Implémenté | ✅ OK |
| AuthWrapper | ✅ Recommandé | ✅ Implémenté | ✅ OK |
| Protection en couches | ✅ Recommandé | ⚠️ Partiel | ⚠️ PARTIEL |
| Routes protégées | ✅ Recommandé | ❌ Absent | ❌ ABSENT |
| Écrans protégés | ✅ Recommandé | ❌ Absent | ❌ ABSENT |
| Firestore Rules | ✅ Critique | ❌ À vérifier | ❌ ABSENT |
| Email Verification Rules | ✅ Recommandé | ❌ Absent | ❌ ABSENT |
| Custom Claims | ✅ Recommandé | ❌ Absent | ❌ ABSENT |
🎯 Plan d'Implémentation Conforme aux Recommandations
Phase 1 : Protection des Écrans (Niveau 2 & 3)
Priorité : HAUTE Conformité : Recommandation officielle Flutter
// Créer un widget ProtectedScreen réutilisable
class ProtectedScreen extends StatelessWidget {
final Widget child;
final bool requireEmailVerified;
const ProtectedScreen({
required this.child,
this.requireEmailVerified = false,
});
@override
Widget build(BuildContext context) {
return Consumer<AuthentificationProvider>(
builder: (context, authProvider, _) {
// Vérifier l'authentification
if (authProvider.currentUser == null) {
return const AuthScreen();
}
// Vérifier l'email si nécessaire
if (requireEmailVerified && !authProvider.isEmailVerified) {
return const VerifyEmailScreen();
}
return child;
},
);
}
}
Phase 2 : Firestore Security Rules (Niveau 4)
Priorité : CRITIQUE Conformité : Recommandation officielle Firebase
service cloud.firestore {
match /databases/{database}/documents {
// Utilisateurs - Authentification requise
match /users/{userId} {
allow read, update, delete: if request.auth != null &&
request.auth.uid == userId;
allow create: if request.auth != null;
}
// Données utilisateur - Email vérifié requis pour écriture
match /users/{userId}/data/{document=**} {
allow read: if request.auth != null &&
request.auth.uid == userId;
allow write: if request.auth != null &&
request.auth.uid == userId &&
request.auth.token.email_verified == true;
}
}
}
Phase 3 : Custom Claims (Optionnel)
Priorité : MOYENNE Conformité : Recommandation officielle Firebase
// Dans Cloud Functions ou Admin SDK
await admin.auth().setCustomUserClaims(uid, {
'emailVerified': user.emailVerified,
'role': userRole,
});
🔒 Recommandations de Sécurité Supplémentaires
1. Defense in Depth (Protection en Couches)
Couche 1 (Frontend) : AuthWrapper âś…
Couche 2 (Frontend) : ProtectedScreen ❌ À ajouter
Couche 3 (Backend) : Firestore Rules ❌ À ajouter
Couche 4 (Backend) : Custom Claims ❌ À ajouter
2. Validation des Données
- ✅ Valider côté client (Flutter)
- ❌ Valider côté serveur (Firestore Rules) - À ajouter
3. Gestion des Erreurs
- âś… Afficher des messages d'erreur clairs
- ❌ Logger les tentatives d'accès non autorisé - À ajouter
4. Monitoring et Audit
- ❌ Tracker les accès non autorisés - À ajouter
- ❌ Alertes de sécurité - À ajouter
📝 Conclusion
État Actuel
- Conformité aux recommandations Flutter : 80% ✅
- Conformité aux recommandations Firebase : 30% ⚠️
- Sécurité globale : 60% ⚠️
Recommandation Finale
Implémenter les phases 1 et 2 pour atteindre : - Conformité Flutter : 100% ✅ - Conformité Firebase : 90% ✅ - Sécurité globale : 95% ✅
Prochaines Étapes
- Immédiat : Implémenter
ProtectedScreen(Phase 1) - Urgent : Vérifier et mettre à jour Firestore Rules (Phase 2)
- Optionnel : Implémenter Custom Claims (Phase 3)