Os SDKs do Firebase Authentication fornecem uma maneira simples de detectar os vários erros que podem ocorrer ao usar métodos de autenticação. Os SDKs para Flutter expõem esses erros por meio da classe FirebaseAuthException
.
No mínimo, um code
e message
são fornecidos; no entanto, em alguns casos, propriedades adicionais, como endereço de e-mail e credencial, também são fornecidas. Por exemplo, se o usuário estiver tentando fazer login com um e-mail e uma senha, quaisquer erros gerados poderão ser detectados explicitamente:
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);
}
Cada método fornece vários códigos de erro e mensagens dependendo do tipo de chamada de autenticação. A API de referência fornece detalhes atualizados sobre os erros de cada método.
Outros erros, como too-many-requests
ou operation-not-allowed
podem ser gerados se você atingir a cota do Firebase Authentication ou não tiver habilitado um provedor de autenticação específico.
Tratamento de erros account-exists-with-different-credential
Se você ativou a configuração Uma conta por endereço de e-mail no console do Firebase , quando um usuário tenta fazer login em um provedor (como o Google) com um e-mail que já existe para o provedor de outro usuário do Firebase (como o Facebook), o erro auth/account-exists-with-different-credential
é lançada junto com uma classe AuthCredential
(token de ID do Google). Para concluir o fluxo de login no provedor pretendido, o usuário deve primeiro fazer login no provedor existente (por exemplo, Facebook) e depois vincular-se ao antigo AuthCredential
(token de ID do 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...
}
}