Google is committed to advancing racial equity for Black communities. See how.
Questa pagina è stata tradotta dall'API Cloud Translation.
Switch to English

Collega più provider di autenticazione a un account tramite JavaScript

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 con cui hanno effettuato l'accesso. Ad esempio, un utente che ha effettuato l'accesso con una password può collegare un account Google e accedere con entrambi i metodi in futuro. In alternativa, un utente anonimo può collegare un account Facebook e, successivamente, accedere con Facebook per continuare a utilizzare la tua app.

Prima di iniziare

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

Per collegare le credenziali di un provider di autenticazione come Google o Facebook a un account utente esistente:

  1. Accedi all'utente utilizzando qualsiasi provider o metodo di autenticazione.
  2. Ottieni l'oggetto AuthProvider che corrisponde al provider che desideri collegare all'account dell'utente. Esempi:
    var googleProvider = new firebase.auth.GoogleAuthProvider();
    var facebookProvider = new firebase.auth.FacebookAuthProvider();
    var twitterProvider = new firebase.auth.TwitterAuthProvider();
    var githubProvider = new firebase.auth.GithubAuthProvider();
  3. Richiedi all'utente di accedere con il provider che desideri collegare. Puoi richiedere agli utenti di accedere aprendo una finestra a comparsa o reindirizzando alla pagina di accesso del provider. Il metodo di reindirizzamento è preferito sui dispositivi mobili.
    • Per accedere con una finestra pop-up, chiama linkWithPopup :
      auth.currentUser.linkWithPopup(provider).then(function(result) {
        // Accounts successfully linked.
        var credential = result.credential;
        var user = result.user;
        // ...
      }).catch(function(error) {
        // Handle Errors here.
        // ...
      });
    • Per accedere reindirizzando alla pagina di accesso del provider, chiama linkWithRedirect :
      auth.currentUser.linkWithRedirect(provider)
        .then(/* ... */)
        .catch(/* ... */);
      Dopo che l'utente ha effettuato l'accesso, vengono reindirizzati alla tua pagina. Quindi, puoi recuperare il risultato di accesso chiamando getRedirectResult quando la tua pagina viene caricata:
      auth.getRedirectResult().then(function(result) {
        if (result.credential) {
          // Accounts successfully linked.
          var credential = result.credential;
          var user = result.user;
          // ...
        }
      }).catch(function(error) {
        // Handle Errors here.
        // ...
      });
    Se l'utente ha effettuato l'accesso correttamente, l'account dell'utente con il provider è collegato all'account dell'utente nel progetto Firebase.

    Il collegamento dell'account fallirà se le credenziali sono già collegate a un altro account utente. In questa situazione, è necessario gestire l'unione degli account e dei dati associati come appropriato per l'app:

    // The implementation of how you store your user data depends on your application
    var repo = new MyUserDataRepo();
    
    // Get reference to the currently signed-in user
    var prevUser = auth.currentUser;
    
    // Get the data which you will want to merge. This should be done now
    // while the app is still signed in as this user.
    var prevUserData = repo.get(prevUser);
    
    // Delete the user's data now, we will restore it if the merge fails
    repo.delete(prevUser);
    
    // Sign in user with the account you want to link to
    auth.signInWithCredential(newCredential).then(function(result) {
      console.log("Sign In Success", result);
      var currentUser = result.user;
      var currentUserData = repo.get(currentUser);
    
      // Merge prevUser and currentUser data stored in Firebase.
      // Note: How you handle this is specific to your application
      var mergedData = repo.merge(prevUserData, currentUserData);
    
      return prevUser.linkWithCredential(result.credential)
        .then(function(linkResult) {
          // Sign in with the newly linked credential
          return auth.signInWithCredential(linkResult.credential);
        })
        .then(function(signInResult) {
          // Save the merged data to the new user
          repo.set(signInResult.user, mergedData);
        });
    }).catch(function(error) {
      // If there are errors we want to undo the data merge/deletion
      console.log("Sign In Error", error);
      repo.set(prevUser, prevUserData);
      repo.set(currentUser, currentUserData);
    });

Per aggiungere l'indirizzo e-mail e le credenziali della password a un account utente esistente:

  1. Accedi all'utente utilizzando qualsiasi provider o metodo di autenticazione.
  2. Richiedi all'utente un indirizzo e-mail e una nuova password.
  3. Crea un oggetto AuthCredential con l'indirizzo e-mail e la password:
    var credential = firebase.auth.EmailAuthProvider.credential(email, password);
  4. Passare l'oggetto AuthCredential al metodo linkWithCredential dell'utente che ha effettuato l' linkWithCredential :

    auth.currentUser.linkWithCredential(credential)
      .then(function(usercred) {
        var user = usercred.user;
        console.log("Account linking success", user);
      }).catch(function(error) {
        console.log("Account linking error", error);
      });

    La chiamata a linkWithCredential fallirà se le credenziali sono già collegate a un altro account utente. In questa situazione, è necessario gestire l'unione degli account e dei dati associati come appropriato per l'app (vedere l'esempio sopra).

È possibile 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, passare l'ID provider al metodo unlink . È possibile ottenere gli ID provider dei provider di autenticazione collegati a un utente dalla proprietà providerData .

user.unlink(providerId).then(function() {
  // Auth provider unlinked from account
  // ...
}).catch(function(error) {
  // An error happened
  // ...
});