Google is committed to advancing racial equity for Black communities. See how.
本頁面由 Cloud Translation API 翻譯而成。
Switch to English

使用JavaScript將多個Auth Provider鏈接到一個帳戶

通過將身份驗證提供程序憑據鏈接到現有用戶帳戶,可以允許用戶使用多個身份驗證提供程序登錄您的應用程序。無論使用哪種身份驗證提供程序登錄,都可以使用相同的Firebase用戶ID來識別用戶。例如,使用密碼登錄的用戶將來可以鏈接Google帳戶並使用這兩種方法登錄。或者,匿名用戶可以鏈接一個Facebook帳戶,然後再與Facebook登錄以繼續使用您的應用程序。

在你開始之前

向您的應用添加對兩個或多個身份驗證提供程序的支持(可能包括匿名身份驗證)。

要將身份驗證提供者(例如Google或Facebook)的憑據鏈接到現有用戶帳戶,請執行以下操作:

  1. 使用任何身份驗證提供程序或方法登錄用戶。
  2. 獲取與要鏈接到用戶帳戶的提供者相對應的AuthProvider對象。示例:
    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. 提示用戶使用您要鏈接的提供程序登錄。您可以通過打開彈出窗口或重定向到提供程序的登錄頁面來提示用戶登錄。在移動設備上首選重定向方法。
    • 要使用彈出窗口登錄,請調用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.
        // ...
      });
    • 要通過重定向到提供者的登錄頁面來登錄,請調用linkWithRedirect
      auth.currentUser.linkWithRedirect(provider)
        .then(/* ... */)
        .catch(/* ... */);
      用戶登錄後,他們將被重定向回到您的頁面。然後,您可以在頁面加載時通過調用getRedirectResult來檢索登錄結果:
      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.
        // ...
      });
    如果用戶成功登錄,則具有提供者的用戶帳戶將鏈接到Firebase項目中的用戶帳戶。

    如果憑據已鏈接到另一個用戶帳戶,則帳戶鏈接將失敗。在這種情況下,您必鬚根據自己的應用程序合併帳戶和相關數據:

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

要將電子郵件地址和密碼憑據添加到現有用戶帳戶,請執行以下操作:

  1. 使用任何身份驗證提供程序或方法登錄用戶。
  2. 提示用戶輸入電子郵件地址和新密碼。
  3. 使用電子郵件地址和密碼創建AuthCredential對象:
    var credential = firebase.auth.EmailAuthProvider.credential(email, password);
  4. AuthCredentialAuthCredential傳遞給登錄用戶的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);
      });

    如果憑據已鏈接到另一個用戶帳戶,則對linkWithCredential的調用將失敗。在這種情況下,您必鬚根據自己的應用程序合併帳戶和相關數據(請參見上面的示例)。

您可以取消與帳戶的身份驗證提供程序的鏈接,以使用戶無法再使用該提供程序登錄。

要將身份驗證提供程序與用戶帳戶unlink ,請將提供程序ID傳遞給unlink方法。您可以從providerData屬性獲取鏈接到用戶的身份驗證提供程序的提供程序ID。

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