Verknüpfen Sie mehrere Authentifizierungsanbieter mithilfe von JavaScript mit einem Konto

Sie können Benutzern erlauben, sich mit mehreren Authentifizierungsanbietern bei Ihrer App anzumelden, indem Sie die Anmeldeinformationen des Authentifizierungsanbieters mit einem vorhandenen Benutzerkonto verknüpfen. Benutzer sind durch dieselbe Firebase-Benutzer-ID identifizierbar, unabhängig davon, welchen Authentifizierungsanbieter sie für die Anmeldung verwendet haben. Beispielsweise kann ein Benutzer, der sich mit einem Passwort angemeldet hat, ein Google-Konto verknüpfen und sich in Zukunft mit einer der beiden Methoden anmelden. Oder ein anonymer Benutzer kann ein Facebook-Konto verknüpfen und sich später bei Facebook anmelden, um Ihre App weiter zu verwenden.

Bevor Sie beginnen

Fügen Sie Ihrer App Unterstützung für zwei oder mehr Authentifizierungsanbieter (möglicherweise einschließlich anonymer Authentifizierung) hinzu.

So verknüpfen Sie Zugangsdaten von einem Authentifizierungsanbieter wie Google oder Facebook mit einem bestehenden Benutzerkonto:

  1. Melden Sie den Benutzer mit einem beliebigen Authentifizierungsanbieter oder einer beliebigen Methode an.
  2. Rufen Sie das AuthProvider Objekt ab, das dem Anbieter entspricht, den Sie mit dem Benutzerkonto verknüpfen möchten. Beispiele:

    Webversion 9

    import { GoogleAuthProvider, FacebookAuthProvider, TwitterAuthProvider, GithubAuthProvider } from "firebase/auth";
    
    const googleProvider = new GoogleAuthProvider();
    const facebookProvider = new FacebookAuthProvider();
    const twitterProvider = new TwitterAuthProvider();
    const githubProvider = new GithubAuthProvider();

    Webversion 8

    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. Fordern Sie den Benutzer auf, sich bei dem Anbieter anzumelden, den Sie verknüpfen möchten. Sie können Ihre Benutzer auffordern, sich anzumelden, indem Sie entweder ein Popup-Fenster öffnen oder auf die Anmeldeseite des Anbieters umleiten. Die Umleitungsmethode wird auf Mobilgeräten bevorzugt.
    • Um sich mit einem Pop-up-Fenster anzumelden, rufen linkWithPopup :

      Webversion 9

      import { getAuth, linkWithPopup, GoogleAuthProvider } from "firebase/auth";
      const provider = new GoogleAuthProvider();
      
      const auth = getAuth();
      linkWithPopup(auth.currentUser, provider).then((result) => {
        // Accounts successfully linked.
        const credential = GoogleAuthProvider.credentialFromResult(result);
        const user = result.user;
        // ...
      }).catch((error) => {
        // Handle Errors here.
        // ...
      });

      Webversion 8

      auth.currentUser.linkWithPopup(provider).then((result) => {
        // Accounts successfully linked.
        var credential = result.credential;
        var user = result.user;
        // ...
      }).catch((error) => {
        // Handle Errors here.
        // ...
      });
    • Rufen linkWithRedirect auf, um sich durch Weiterleitung zur Anmeldeseite des Anbieters anzumelden:

      Webversion 9

      import { getAuth, linkWithRedirect, GoogleAuthProvider } from "firebase/auth";
      const provider = new GoogleAuthProvider();
      
      const auth = getAuth();
      linkWithRedirect(auth.currentUser, provider)
        .then(/* ... */)
        .catch(/* ... */);

      Webversion 8

      auth.currentUser.linkWithRedirect(provider)
        .then(/* ... */)
        .catch(/* ... */);
      Nachdem sich der Benutzer angemeldet hat, wird er zurück auf Ihre Seite umgeleitet. Anschließend können Sie das Anmeldeergebnis abrufen, indem Sie getRedirectResult aufrufen, wenn Ihre Seite geladen wird:

      Webversion 9

      import { getRedirectResult } from "firebase/auth";
      getRedirectResult(auth).then((result) => {
        const credential = GoogleAuthProvider.credentialFromResult(result);
        if (credential) {
          // Accounts successfully linked.
          const user = result.user;
          // ...
        }
      }).catch((error) => {
        // Handle Errors here.
        // ...
      });

      Webversion 8

      auth.getRedirectResult().then((result) => {
        if (result.credential) {
          // Accounts successfully linked.
          var credential = result.credential;
          var user = result.user;
          // ...
        }
      }).catch((error) => {
        // Handle Errors here.
        // ...
      });
    Wenn der Benutzer erfolgreich angemeldet ist, wird das Konto des Benutzers beim Anbieter mit dem Konto des Benutzers in Ihrem Firebase-Projekt verknüpft.

    Die Kontoverknüpfung schlägt fehl, wenn die Anmeldeinformationen bereits mit einem anderen Benutzerkonto verknüpft sind. In dieser Situation müssen Sie das Zusammenführen der Konten und zugehörigen Daten entsprechend Ihrer App handhaben:

    Webversion 9

    import { getAuth, signInWithCredential, linkWithCredential, OAuthProvider } from "firebase/auth";
    
    // The implementation of how you store your user data depends on your application
    const repo = new MyUserDataRepo();
    
    // Get reference to the currently signed-in user
    const auth = getAuth();
    const 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.
    const 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
    signInWithCredential(auth, newCredential).then((result) => {
      console.log("Sign In Success", result);
      const currentUser = result.user;
      const currentUserData = repo.get(currentUser);
    
      // Merge prevUser and currentUser data stored in Firebase.
      // Note: How you handle this is specific to your application
      const mergedData = repo.merge(prevUserData, currentUserData);
    
      const credential = OAuthProvider.credentialFromResult(result);
      return linkWithCredential(prevUser, credential)
        .then((linkResult) => {
          // Sign in with the newly linked credential
          const linkCredential = OAuthProvider.credentialFromResult(linkResult);
          return signInWithCredential(auth, linkCredential);
        })
        .then((signInResult) => {
          // Save the merged data to the new user
          repo.set(signInResult.user, mergedData);
        });
    }).catch((error) => {
      // If there are errors we want to undo the data merge/deletion
      console.log("Sign In Error", error);
      repo.set(prevUser, prevUserData);
    });

    Webversion 8

    // 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((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((linkResult) => {
          // Sign in with the newly linked credential
          return auth.signInWithCredential(linkResult.credential);
        })
        .then((signInResult) => {
          // Save the merged data to the new user
          repo.set(signInResult.user, mergedData);
        });
    }).catch((error) => {
      // If there are errors we want to undo the data merge/deletion
      console.log("Sign In Error", error);
      repo.set(prevUser, prevUserData);
    });

So fügen Sie einem bestehenden Benutzerkonto E-Mail-Adresse und Passwort hinzu:

  1. Melden Sie den Benutzer mit einem beliebigen Authentifizierungsanbieter oder einer beliebigen Methode an.
  2. Fordern Sie den Benutzer zur Eingabe einer E-Mail-Adresse und eines neuen Kennworts auf.
  3. Erstellen Sie ein AuthCredential -Objekt mit der E-Mail-Adresse und dem Passwort:

    Webversion 9

    import { EmailAuthProvider } from "firebase/auth";
    
    const credential = EmailAuthProvider.credential(email, password);

    Webversion 8

    var credential = firebase.auth.EmailAuthProvider.credential(email, password);
  4. Übergeben Sie das AuthCredential -Objekt an die linkWithCredential -Methode des angemeldeten Benutzers:

    Webversion 9

    import { getAuth, linkWithCredential } from "firebase/auth";
    
    const auth = getAuth();
    linkWithCredential(auth.currentUser, credential)
      .then((usercred) => {
        const user = usercred.user;
        console.log("Account linking success", user);
      }).catch((error) => {
        console.log("Account linking error", error);
      });

    Webversion 8

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

    Der Aufruf von linkWithCredential fehl, wenn die Anmeldeinformationen bereits mit einem anderen Benutzerkonto verknüpft sind. In dieser Situation müssen Sie das Zusammenführen der Konten und zugehörigen Daten entsprechend Ihrer App handhaben (siehe Beispiel oben).

Sie können die Verknüpfung eines Authentifizierungsanbieters mit einem Konto aufheben, sodass sich der Benutzer nicht mehr bei diesem Anbieter anmelden kann.

Um die Verknüpfung eines Authentifizierungsanbieters mit einem Benutzerkonto aufzuheben, übergeben Sie die Anbieter-ID an die Methode zum unlink der Verknüpfung. Sie können die Anbieter-IDs der mit einem Benutzer verknüpften Authentifizierungsanbieter aus der Eigenschaft „ providerData “ abrufen.

Webversion 9

import { getAuth, unlink } from "firebase/auth";

const auth = getAuth();
unlink(auth.currentUser, providerId).then(() => {
  // Auth provider unlinked from account
  // ...
}).catch((error) => {
  // An error happened
  // ...
});

Webversion 8

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