Skip to content

📚 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

  1. Immédiat : Implémenter ProtectedScreen (Phase 1)
  2. Urgent : Vérifier et mettre à jour Firestore Rules (Phase 2)
  3. Optionnel : Implémenter Custom Claims (Phase 3)

đź”— Ressources Officielles