Firebase:如果该电子邮件已经用于Google,Microsoft等帐户,是否可以添加新的电子邮件/密码帐户?

时间:2019-11-10 22:07:16

标签: firebase firebase-authentication

在登录方式下,我已经启用了“每个电子邮件地址多个帐户”。

我具有连接到Google帐户和Microsoft帐户的相同电子邮件地址-因此,我已经能够成功使用Google和Microsoft登录方法在同一个Firebase实例上创建两个单独的用户。

我无法执行的操作是为“电子邮件/密码”方法创建另一个帐户。如果尝试通过控制台(添加电子邮件/密码用户)添加它,则会收到“已经存在”错误,如果尝试通过管理SDK添加它,则会出现一般错误。

能否请您告知我尝试做的事情是否可行,如果可以,我应该怎么做?

编辑:我应该明确地说-问题是允许多个共享相同电子邮件地址的帐户(未链接且完全独立),而不是允许单个Firebase帐户连接多个提供商。

编辑2:我已将第一个回答标记为答案-出于安全原因,我认为当已经有来自受信任提供商的帐户(例如, google.com),因此我们采用了一种方法,即在响应中概述的一个帐户上将多个提供者标记为答案。

1 个答案:

答案 0 :(得分:0)

是的,电子邮件和密码凭据可能已链接到现有的Firebase帐户。 Firebase Web文档描述了以下过程。

  

Link email address and password credentials to a user account

     

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

     
      
  1. 使用任何身份验证提供程序或方法登录用户。
  2.   
  3. 提示用户输入电子邮件地址和新密码。
  4.   
  5. 使用电子邮件地址和密码创建一个AuthCredential对象:
  6.   
var credential = firebase.auth.EmailAuthProvider.credential(email, password);
     
      
  1. AuthCredential对象传递给登录用户的linkWithCredential方法:
  2.   
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);
});