Com os SDKs do Firebase Authentication, você tem uma maneira simples de detectar os diversos erros que podem ocorrer
com o uso de métodos de autenticação. Os SDKs do Flutter expõem esses erros por meio da classe
FirebaseAuthException
.
No mínimo, 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 senha,
qualquer erro gerado poderá ser detectado 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 invocação de autenticação. A API Reference oferece 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 ativado um provedor de autenticação específico.
Como processar os erros account-exists-with-different-credential
Se você tiver ativado a configuração Uma conta por endereço de e-mail no Console do Firebase,
quando um usuário tentar se conectar a um provedor (como o Google) com um e-mail que já existe em outro provedor de usuário do Firebase
(como o Facebook), o erro auth/account-exists-with-different-credential
será exibido com uma classe AuthCredential
(token de ID do Google).
Para concluir o fluxo de login para o provedor pretendido, o usuário primeiro precisa fazer login no provedor atual (por exemplo, Facebook) e depois vinculá-lo ao AuthCredential
anterior
(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...
}
}