使用 JavaScript 将多个身份验证提供方与一个帐号相关联

您可以通过将身份验证提供方凭据关联至现有用户帐号,让用户可以使用多个身份验证提供方服务登录您的应用。无论用户使用哪个身份验证提供方服务登录,均可通过同一 Firebase 用户 ID 识别用户。例如,使用密码登录的用户可以关联 Google 帐号,以后便可使用这两种方法中的任意一种登录。或者,匿名用户可以关联 Facebook 帐号,以后就可以使用 Facebook 登录,然后继续使用您的应用。

开始之前

为您的应用增加对两个或多个身份验证提供商(可能包括匿名身份验证)的支持。

将联合身份验证提供方凭据与用户帐号关联

要将身份验证提供商(例如 Google 或 Facebook)的凭据与现有用户帐号关联,请按以下步骤操作:

  1. 使用任意身份验证提供商或方法让用户登录。
  2. 获取与要关联用户帐号的提供商相对应的 AuthProvider 对象。示例:
    var provider = new firebase.auth.GoogleAuthProvider();
    var provider = new firebase.auth.FacebookAuthProvider();
    var provider = new firebase.auth.TwitterAuthProvider();
    var provider = 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);
      
      用户在登录之后会被重定向回您的页面。然后您可以在页面加载时通过调用 getRedirectResult 来检索登录结果:
      firebase.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 项目中的帐号相关联。

    如果凭据已与另一用户帐号关联,则帐号关联将失败。在这种情况下,您必须根据需要为您的应用合并帐号和相关数据:

    // Get reference to the currently signed-in user
    var prevUser = auth.currentUser;
    // Sign in user with another account
    auth.signInWithCredential(credential).then(function(user) {
      console.log("Sign In Success", user);
      var currentUser = user;
      // Merge prevUser and currentUser data stored in Firebase.
      // Note: How you handle this is specific to your application
    
      // After data is migrated delete the duplicate user
      return user.delete().then(function() {
        // Link the OAuth Credential to original account
        return prevUser.linkWithCredential(credential);
      }).then(function() {
        // Sign in with the newly linked credential
        return auth.signInWithCredential(credential);
      });
    }).catch(function(error) {
      console.log("Sign In Error", error);
    });
    

将电子邮件地址和密码凭据与用户帐号相关联

要将电子邮件地址和密码凭据添加到现有用户帐号,请按以下步骤操作:

  1. 使用任意身份验证提供商或方法让用户登录。
  2. 提示用户输入电子邮件地址和新密码。
  3. 使用该电子邮件地址和密码创建一个 AuthCredential 对象:
    var credential = firebase.auth.EmailAuthProvider.credential(email, password);
    
  4. AuthCredential 对象传递给登录用户的 linkWithCredential 方法:

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

    如果凭据已与另一用户帐号关联,则无法调用 linkWithCredential。在这种情况下,您必须根据需要为您的应用合并帐号和相关数据:

    // Get reference to the currently signed-in user
    var prevUser = auth.currentUser;
    // Sign in user with another account
    auth.signInWithCredential(credential).then(function(user) {
      console.log("Sign In Success", user);
      var currentUser = user;
      // Merge prevUser and currentUser data stored in Firebase.
      // Note: How you handle this is specific to your application
    
      // After data is migrated delete the duplicate user
      return user.delete().then(function() {
        // Link the OAuth Credential to original account
        return prevUser.linkWithCredential(credential);
      }).then(function() {
        // Sign in with the newly linked credential
        return auth.signInWithCredential(credential);
      });
    }).catch(function(error) {
      console.log("Sign In Error", error);
    });
    

取消身份验证提供商与用户帐号的关联

您可以取消身份验证提供商与帐号的关联,这样用户就无法再通过该提供商登录了。

要取消身份验证提供商与用户帐号的关联,请将提供商 ID 传递给 unlink 方法。您可以从 providerData 属性获取与用户相关联的身份验证提供商的提供商 ID。

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

发送以下问题的反馈:

此网页
需要帮助?请访问我们的支持页面