Comment supprimer un utilisateur dans Firebase avec Flutter


Avatar de Pierre Courtois

Permettre à un utilisateur de supprimer son compte est une fonctionnalité obligatoire pour publier votre application sur Android ou Apple. Je vous explique donc ici, les deux manières de réaliser cette action, afin de mettre votre application Flutter en règle.


supprimer compte firebase

Suppression manuelle d’un utilisateur via la console Firebase

La manière la plus simple et la plus directe de supprimer un compte dans Firebase est de le faire manuellement depuis la console. Pour supprimer un utilisateur de votre application Flutter, voici les étapes à suivre :

Accéder à Firebase Console : Connectez-vous à la console Firebase et sélectionnez votre projet.

Accéder à l’authentification : Dans le menu de gauche, sélectionnez « Authentification » pour accéder à la liste des utilisateurs de votre application.

Supprimer un utilisateur : Dans l’onglet « Utilisateurs », vous verrez une liste de tous les utilisateurs enregistrés. Vous pouvez rechercher l’utilisateur que vous souhaitez supprimer par son email ou son identifiant utilisateur. Ensuite, cliquez sur les trois points à droite de l’utilisateur et sélectionnez « Supprimer ».

La suppression d’un utilisateur depuis Firebase Authentication ne supprime pas ses données dans Firestore ou Realtime Database. Si vous avez des informations supplémentaires enregistrées, pensez aussi à les supprimer manuellement.

Suppression d’un utilisateur depuis une application Flutter

Si supprimer un utilisateur à la main est possible, ce n’est pas la meilleure solution d’un point de vue UX et de scalabilité. Je vous partage donc ici un code que vous pouvez adapter selon vos besoins, pour qu’un utilisateur puisse supprimer son compte, directement depuis votre application Flutter.

Les étapes de fonctionnement sont les suivantes :

  • Une fois confirmé, le compte utilisateur est supprimé à la fois de Firebase Authentication et de Firestore.
  • Un toast s’affiche lorsque l’utilisateur appuie brièvement pour lui demander de maintenir le bouton s’il souhaite supprimer son compte.
  • Si l’utilisateur maintient le bouton enfoncé, une fenêtre contextuelle (dialogue) apparaît pour confirmer l’action.
//Declaration d'une instance FirebaseAuth 
FirebaseAuth auth = FirebaseAuth.instance;

//Bouton pour supprimer son application
ElevatedButton(
  onPressed: () {
    Fluttertoast.showToast(
      msg: "Appuyez longtemps pour supprimer votre compte. Cette action est définitive.",
    );
  },
  onLongPress: () async {
    _showDeleteConfirmation(context);
  },
  child: const Text("Supprimer mon compte"),
),


// Fonction pour afficher la confirmation de suppression
void _showDeleteConfirmation(BuildContext context) {
  showDialog(
    context: context,
    builder: (BuildContext dialogContext) {
      return AlertDialog(
        title: const Text("Confirmer la suppression"),
        content: const Text(
          "Êtes-vous sûr de vouloir supprimer votre compte ? Cette action est définitive.",
        ),
        actions: [
          TextButton(
            onPressed: () => Navigator.pop(dialogContext),
            child: const Text("Annuler"),
          ),
          TextButton(
            onPressed: () async {
              // Fermer le dialogue
              Navigator.pop(dialogContext);

              // Suppression du compte utilisateur
              var userID = FirebaseAuth.instance.currentUser!.uid;

              try {
                await _deleteUserInfo(userID); // Supprimer les données Firestore
                await deleteUserAccount(); // Supprimer le compte Firebase
              } catch (e) {
                print("Erreur lors de la suppression du compte: $e");
              }

              // Redirection après suppression
              Navigator.pushReplacement(
                dialogContext,
                MaterialPageRoute(builder: (_) => const FirstScreen()),
              );
            },
            child: const Text(
              "Supprimer",
              style: TextStyle(color: Colors.red),
            ),
          ),
        ],
      );
    },
  );
}


// Fonction pour supprimer le compte utilisateur Firebase
Future<void> deleteUserAccount() async {
  try {
    await FirebaseAuth.instance.currentUser!.delete();
  } on FirebaseAuthException catch (e) {
    if (e.code == "requires-recent-login") {
      await _reauthenticateAndDelete();
    } else {
      print("Erreur Firebase: $e");
    }
  } catch (e) {
    print("Erreur lors de la suppression: $e");
  }
}

// Fonction pour réauthentifier l'utilisateur si nécessaire avant suppression
Future<void> _reauthenticateAndDelete() async {
try {
    final providerData = auth.currentUser?.providerData.first;

    if (AppleAuthProvider().providerId == providerData!.providerId) {
      await auth.currentUser!.reauthenticateWithProvider(AppleAuthProvider());
    } else if (GoogleAuthProvider().providerId == providerData.providerId) {
      await auth.currentUser!.reauthenticateWithProvider(GoogleAuthProvider());
    }

    await auth.currentUser?.delete();
  } catch (e) {
    print("Erreur lors de la réauthentification: $e");
  }
}


// Fonction pour supprimer les données utilisateur dans Firestore. Pensez à remplacer le chemin du docs, avec les bonnes valeurs.
Future<void> _deleteUserInfo(String userID) async {
  try {
    await FirebaseFirestore.instance.collection("Users").doc(userID).delete();
  } catch (e) {
    print("Erreur lors de la suppression des données Firestore: $e");
  }
}

À quoi sert la fonction _reauthenticateAndDelete() ?

La fonction _reauthenticateAndDelete() sert à réauthentifier l’utilisateur avant de permettre certaines opérations sensibles, comme la suppression de compte ou la modification d’informations critiques (email, mot de passe, etc.).

En effet, Firebase impose la réauthentification si :

  • L’utilisateur tente de supprimer son compte ou de changer des informations critiques : Firebase demande une preuve supplémentaire que l’utilisateur est bien celui qui initie l’action.
  • La session utilisateur est trop ancienne : Même si l’utilisateur est connecté, sa session peut être jugée « non récente » pour les opérations sensibles.

Voilà pourquoi il est important d’ajouter cette fonction, dans le cas où la fonction deleteUserAccount() renverrait le message d’erreur « requires-recent-login ». 

Conclusion

Permettre à vos utilisateurs de se créer un compte sur votre application et de le supprimer à leur guise est très bien, mais de votre côté, vous souhaitez peut-être éviter les créations abusives de compte ? Pourquoi ne pas ajouter un système de vérification d’email pour votre application Flutter ?

Avatar de Pierre Courtois