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 ».
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 ?