Les SDK Firebase Authentication permettent de détecter facilement les différentes erreurs pouvant se produire lors de l'utilisation de méthodes d'authentification. Les SDK pour Flutter exposent ces erreurs via la classe FirebaseAuthException
.
Au minimum, un code
et un message
sont fournis. Toutefois, dans certains cas, des propriétés supplémentaires telles qu'une adresse e-mail et des identifiants sont également fournies. Par exemple, si l'utilisateur tente de se connecter avec une adresse e-mail et un mot de passe, toutes les erreurs générées peuvent être détectées explicitement :
try {
await FirebaseAuth.instance.signInWithEmailAndPassword(
email: "barry.allen@example.com",
password: "SuperSecretPassword!"
);
} on FirebaseAuthException catch (e) {
print('Failed with error code: ${e.code}');
print(e.message);
}
Chaque méthode fournit différents codes et messages d'erreur en fonction du type d'appel d'authentification. L'API de référence fournit des informations à jour sur les erreurs pour chaque méthode.
D'autres erreurs telles que too-many-requests
ou operation-not-allowed
peuvent se produire si vous atteignez le quota Firebase Authentication ou si vous n'avez pas activé un fournisseur d'authentification spécifique.
Gérer les erreurs account-exists-with-different-credential
Si vous avez activé le paramètre "Un compte par adresse e-mail" dans la console Firebase, lorsqu'un utilisateur tente de se connecter à un fournisseur (tel que Google) avec une adresse e-mail existant déjà pour le fournisseur d'un autre utilisateur Firebase (tel que Facebook), l'erreur auth/account-exists-with-different-credential
est générée avec une classe AuthCredential
(jeton d'ID Google).
Pour terminer le parcours de connexion au fournisseur souhaité, l'utilisateur doit d'abord se connecter au fournisseur existant (par exemple, Facebook), puis l'associer à l'ancien AuthCredential
(jeton d'ID Google).
FirebaseAuth auth = FirebaseAuth.instance;
// Create a credential from a Google Sign-in Request
var googleAuthCredential = GoogleAuthProvider.credential(accessToken: 'xxxx');
try {
// Attempt to sign in the user in with Google
await auth.signInWithCredential(googleAuthCredential);
} on FirebaseAuthException catch (e) {
if (e.code == 'account-exists-with-different-credential') {
// The account already exists with a different credential
String email = e.email;
AuthCredential pendingCredential = e.credential;
// Fetch a list of what sign-in methods exist for the conflicting user
List<String> userSignInMethods = await auth.fetchSignInMethodsForEmail(email);
// If the user has several sign-in methods,
// the first method in the list will be the "recommended" method to use.
if (userSignInMethods.first == 'password') {
// Prompt the user to enter their password
String password = '...';
// Sign the user in to their account with the password
UserCredential userCredential = await auth.signInWithEmailAndPassword(
email: email,
password: password,
);
// Link the pending credential with the existing account
await userCredential.user.linkWithCredential(pendingCredential);
// Success! Go back to your application flow
return goToApplication();
}
// Since other providers are now external, you must now sign the user in with another
// auth provider, such as Facebook.
if (userSignInMethods.first == 'facebook.com') {
// Create a new Facebook credential
String accessToken = await triggerFacebookAuthentication();
var facebookAuthCredential = FacebookAuthProvider.credential(accessToken);
// Sign the user in with the credential
UserCredential userCredential = await auth.signInWithCredential(facebookAuthCredential);
// Link the pending credential with the existing account
await userCredential.user.linkWithCredential(pendingCredential);
// Success! Go back to your application flow
return goToApplication();
}
// Handle other OAuth providers...
}
}