Manipulação de erros

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...
  }
}