Save the date - Google I/O returns May 18-20. Register to get the most out of the digital experience: Build your schedule, reserve space, participate in Q&As, earn Google Developer profile badges, and more. Register now
Diese Seite wurde von der Cloud Translation API übersetzt.
Switch to English

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 Anmeldeinformationen des Authentifizierungsanbieters mit einem vorhandenen Benutzerkonto verknüpfen. Benutzer können unabhängig vom Authentifizierungsanbieter, mit dem sie sich angemeldet haben, anhand derselben Firebase-Benutzer-ID identifiziert werden. Beispielsweise kann ein Benutzer, der sich mit einem Kennwort angemeldet hat, ein Google-Konto verknüpfen und sich künftig mit beiden Methoden anmelden. Oder ein anonymer Benutzer kann ein Facebook-Konto verknüpfen und sich später bei Facebook anmelden, um Ihre App weiterhin 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 Anmeldeinformationen eines Authentifizierungsanbieters wie Google oder Facebook mit einem vorhandenen Benutzerkonto:

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

    Web v8

    var googleProvider = new firebase.auth.GoogleAuthProvider();
    var facebookProvider = new firebase.auth.FacebookAuthProvider();
    var twitterProvider = new firebase.auth.TwitterAuthProvider();
    var githubProvider = new firebase.auth.GithubAuthProvider();

    Web v9

    import { GoogleAuthProvider, FacebookAuthProvider, TwitterAuthProvider, GithubAuthProvider } from "firebase/auth";
    
    const googleProvider = new GoogleAuthProvider();
    const facebookProvider = new FacebookAuthProvider();
    const twitterProvider = new TwitterAuthProvider();
    const githubProvider = new GithubAuthProvider();
  3. Fordern Sie den Benutzer auf, sich bei dem Anbieter anzumelden, den Sie verknüpfen möchten. Sie können Ihre Benutzer zur Anmeldung auffordern, indem Sie entweder ein Popup-Fenster öffnen oder zur Anmeldeseite des Anbieters umleiten. Die Umleitungsmethode wird auf Mobilgeräten bevorzugt.
    • Um sich mit einem Popup-Fenster linkWithPopup , rufen Sie linkWithPopup :

      Web v8

      auth.currentUser.linkWithPopup(provider).then((result) => {
        // Accounts successfully linked.
        var credential = result.credential;
        var user = result.user;
        // ...
      }).catch((error) => {
        // Handle Errors here.
        // ...
      });

      Web v9

      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.
        // ...
      });
    • Rufen Sie linkWithRedirect , um sich linkWithRedirect , linkWithRedirect des Anbieters linkWithRedirect :

      Web v8

      auth.currentUser.linkWithRedirect(provider)
        .then(/* ... */)
        .catch(/* ... */);

      Web v9

      import { getAuth, linkWithRedirect, GoogleAuthProvider } from "firebase/auth";
      const provider = new GoogleAuthProvider();
      
      const auth = getAuth();
      linkWithRedirect(auth.currentUser, provider)
        .then(/* ... */)
        .catch(/* ... */);
      Nachdem sich der Benutzer angemeldet hat, wird er zurück zu Ihrer Seite weitergeleitet. Anschließend können Sie das getRedirectResult indem Sie getRedirectResult aufrufen, wenn Ihre Seite getRedirectResult :

      Web v8

      auth.getRedirectResult().then((result) => {
        if (result.credential) {
          // Accounts successfully linked.
          var credential = result.credential;
          var user = result.user;
          // ...
        }
      }).catch((error) => {
        // Handle Errors here.
        // ...
      });

      Web v9

      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.
        // ...
      });
    Wenn der Benutzer erfolgreich angemeldet ist, wird das Benutzerkonto beim Anbieter mit dem Benutzerkonto 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 der zugehörigen Daten entsprechend Ihrer App behandeln:

    Web v8

    // 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);
    });

    Web v9

    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);
    });

So fügen Sie einem vorhandenen Benutzerkonto E-Mail-Adresse und Kennwortanmeldeinformationen hinzu:

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

    Web v8

    var credential = firebase.auth.EmailAuthProvider.credential(email, password);

    Web v9

    import { EmailAuthProvider } from "firebase/auth";
    
    const credential = EmailAuthProvider.credential(email, password);
  4. AuthCredential das AuthCredential Objekt an die linkWithCredential Methode des angemeldeten Benutzers:

    Web v8

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

    Web v9

    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);
      });

    Der Aufruf von linkWithCredential fehl, wenn die Anmeldeinformationen bereits mit einem anderen Benutzerkonto verknüpft sind. In dieser Situation müssen Sie die für Ihre App geeigneten Konten und zugehörigen Daten zusammenführen (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 von einem Benutzerkonto aufzuheben, übergeben Sie die Anbieter-ID an die Methode zum unlink der unlink . Sie können die Anbieter-IDs der mit einem Benutzer verknüpften Authentifizierungsanbieter über die Eigenschaft providerData abrufen.

Web v8

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

Web v9

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

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