Vincule vários provedores de autenticação a uma conta

Você pode permitir que os usuários façam login no seu aplicativo usando vários provedores de autenticação vinculando as credenciais do provedor de autenticação a uma conta de usuário existente. Os usuários são identificáveis ​​pelo mesmo ID de usuário do Firebase, independentemente do provedor de autenticação usado para fazer login. Por exemplo, um usuário que fez login com uma senha pode vincular uma conta do Google e fazer login com qualquer um dos métodos no futuro. Ou um usuário anônimo pode vincular uma conta do Facebook e, posteriormente, fazer login no Facebook para continuar usando seu aplicativo.

Antes de você começar

Adicione suporte para dois ou mais provedores de autenticação (possivelmente incluindo autenticação anônima) ao seu aplicativo.

Para vincular credenciais do provedor de autenticação a uma conta de usuário existente:

  1. Faça login do usuário usando qualquer provedor ou método de autenticação.

  2. Conclua o fluxo de entrada para o novo provedor de autenticação até, mas não incluindo, chamar um dos métodos signInWith -. Por exemplo, obtenha o token de ID do Google, o token de acesso do Facebook ou o e-mail e a senha do usuário.

  3. Obtenha um objeto Credential para o novo provedor de autenticação:

    // Google Sign-in
    final credential = GoogleAuthProvider.credential(idToken: idToken);
    
    // Email and password sign-in
    final credential =
        EmailAuthProvider.credential(email: emailAddress, password: password);
    
    // Etc.
    
  4. Passe o objeto Credential para o método linkWithCredential() do usuário de login:

    try {
      final userCredential = await FirebaseAuth.instance.currentUser
          ?.linkWithCredential(credential);
    } on FirebaseAuthException catch (e) {
      switch (e.code) {
        case "provider-already-linked":
          print("The provider has already been linked to the user.");
          break;
        case "invalid-credential":
          print("The provider's credential is not valid.");
          break;
        case "credential-already-in-use":
          print("The account corresponding to the credential already exists, "
              "or is already linked to a Firebase User.");
          break;
        // See the API reference for the full list of error codes.
        default:
          print("Unknown error.");
      }
      ```
    

Se a chamada para linkWithCredential() for bem-sucedida, o usuário agora poderá fazer login usando qualquer provedor de autenticação vinculado e acessar os mesmos dados do Firebase.

Você pode desvincular um provedor de autenticação de uma conta para que o usuário não possa mais fazer login nesse provedor.

Para desvincular um provedor de autenticação de uma conta de usuário, passe o ID do provedor para o método unlink() . Você pode obter os IDs dos provedores de autenticação vinculados a um usuário na propriedade providerData do objeto User .

try {
  await FirebaseAuth.instance.currentUser?.unlink(providerId);
} on FirebaseAuthException catch (e) {
  switch (e.code) {
    case "no-such-provider":
      print("The user isn't linked to the provider or the provider "
          "doesn't exist.");
      break;
    default:
      print("Unknown error.");
  }
}