Collegare più provider di autenticazione a un account

Puoi consentire agli utenti di accedere alla tua app utilizzando più provider di autenticazione collegando le credenziali del provider di autenticazione a un account utente esistente. Gli utenti sono identificabili dallo stesso ID utente Firebase, indipendentemente dal provider di autenticazione utilizzato per l'accesso. Ad esempio, un utente che ha eseguito l'accesso con una password può collegare un Account Google e accedere con uno dei due metodi in futuro. In alternativa, un utente anonimo può collegare un account Facebook e poi accedere con Facebook per continuare a utilizzare la tua app.

Prima di iniziare

Aggiungi il supporto per due o più provider di autenticazione (inclusa, se necessario, l'autenticazione anonima) alla tua app.

Per collegare le credenziali del provider di autenticazione a un account utente esistente:

  1. Accedi all'utente utilizzando un qualsiasi provider o metodo di autenticazione.

  2. Completa il flusso di accesso per il nuovo provider di autenticazione fino alla chiamata di uno dei metodi signInWith (esclusa) . Ad esempio, recupera il token ID Google, il token di accesso di Facebook o l'indirizzo email e la password dell'utente.

  3. Recupera un oggetto Credential per il nuovo provider di autenticazione:

    // Google Sign-in
    final credential = GoogleAuthProvider.credential(idToken: idToken);
    
    // Email and password sign-in
    final credential =
        EmailAuthProvider.credential(email: emailAddress, password: password);
    
    // Etc.
    
  4. Passa l'oggetto Credential al linkWithCredential() metodo dell'utente che ha eseguito l'accesso:

    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 la chiamata a linkWithCredential() va a buon fine, l'utente può ora accedere utilizzando qualsiasi provider di autenticazione collegato e accedere agli stessi dati Firebase.

Puoi scollegare un provider di autenticazione da un account in modo che l'utente non possa più accedere con quel provider.

Per scollegare un provider di autenticazione da un account utente, passa l'ID del provider al metodo unlink(). Puoi recuperare gli ID dei provider di autenticazione collegati a un utente dalla proprietà providerData dell'oggetto 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.");
  }
}

Risoluzione dei problemi

Se riscontri errori durante il tentativo di collegare più account, consulta la documentazione sugli indirizzi email verificati.