Firebase,由同一电子邮件登录不同的提供商

Duc*_*ang 5 firebase angularfire firebase-authentication firebase-realtime-database

我希望我的用户可以使用许多不同的提供商登录,但如果他们只使用一个电子邮件地址,他们将获得相同的结 例如,在stackoverflow中我可以通过Facebook,Google登录...但我仍然可以保留我的个人资料以及我的帖子......

在Firebase Web中,例如,如果我的用户使用电子邮件/密码提供商创建了帐户,则他的电子邮件="ex@gmail.com"password ="123456".此帐户有uid ="account1",我使用此uid作为密钥在Firebase数据库中存储有关他的其他信息.

有一天,他选择由Google提供商和Facebook提供商登录(仍然是ex@gmail.com),我在auth设置中测试了2个案例:

  • "防止使用相同的电子邮件地址创建多个帐户":新的Google登录将覆盖旧的"account1",由于错误,我无法使用"ex@gmail.com"创建新的Facebook帐户:"已存在相同的帐户电子邮件地址".这两个我都不想发生

  • "允许使用相同的电子邮件地址创建多个帐户":使用此选项我可以使用相同的电子邮件地址创建许多帐户,但他们有不同的uid,我不知道如何将这些uid链接到"account1"?在Google和Facebook登录后,我也无法收到电子邮件(email = null).

所以firebase可以帮助我在很多应用程序中做我喜欢的事情(通过许多不同方式登录但结果相同)?

boj*_*eil 11

Firebase Auth支持"禁止使用相同的电子邮件地址创建多个帐户".然而,谷歌是一个特例,因为它是经过验证的提供商,并将使用相同的电子邮件覆盖未经验证的帐户.例如,如果创建了一个电子邮件/密码帐户但未经过验证,然后用户使用相同的电子邮件登录Google,则会覆盖旧密码并取消链接,但会返回相同的用户(相同的uid).

对于其他情况,这是它的处理方式.

假设您使用电子邮件/密码通过帐户user@example.com使用电子邮件/密码登录.然后,用户尝试使用相同的电子邮件登录Facebook提供商.Auth后端将抛出错误,并且将需要链接.完成此操作后,用户可以使用任一帐户登录.

这是一个例子:

var existingEmail = null;
var pendingCred = null;
var facebookProvider = new firebase.auth.FacebookAuthProvider();
firebase.auth().signInWithPopup(facebookProvider)
  .then(function(result) {
    // Successful sign-in.
  });
  .catch(function(error) {
    // Account exists with different credential. To recover both accounts
    // have to be linked but the user must prove ownership of the original
    // account.
    if (error.code == 'auth/account-exists-with-different-credential') {
      existingEmail = error.email;
      pendingCred = error.credential;
      // Lookup existing account’s provider ID.
      return firebase.auth().fetchProvidersForEmail(error.email)
        .then(function(providers) {
           if (providers.indexOf(firebase.auth.EmailAuthProvider.PROVIDER_ID) != -1) {
             // Password account already exists with the same email.
             // Ask user to provide password associated with that account.
             var password = window.prompt('Please provide the password for ' + existingEmail);
             return firebase.auth().signInWithEmailAndPassword(existingEmail, password);    
           } else if (providers.indexOf(firebase.auth.GoogleAuthProvider.PROVIDER_ID) != -1) {
             var googProvider = new firebase.auth.GoogleAuthProvider();
             // Sign in user to Google with same account.
             provider.setCustomParameters({'login_hint': existingEmail});
             return firebase.auth().signInWithPopup(googProvider).then(function(result) {
               return result.user;
             });
           } else {
             ...
           }
        })
        .then(function(user) {
          // Existing email/password or Google user signed in.
          // Link Facebook OAuth credential to existing account.
          return user.linkWithCredential(pendingCred);
        });
    }
    throw error;
  });
Run Code Online (Sandbox Code Playgroud)

  • 谢了,你救了我的命。我可以阻止 Google 提供商覆盖未经验证的帐户吗?因为我生成一个默认密码并将其通过电子邮件验证发送给用户,如果 Google 提供商在确认之前覆盖此帐户。他们无法使用我发送的电子邮件和密码登录,并且感到困惑 (2认同)