首页 > 解决方案 > Firebase:当该电子邮件已用于 Google、Microsoft 等帐户时,是否可以添加新的电子邮件/密码帐户?

问题描述

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

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

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

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

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

编辑 2:我已将第一个响应标记为答案 - 我假设,出于安全原因,当已经有来自受信任的提供商(例如 google.com)的帐户时,不可能简单地添加电子邮件/密码帐户),因此我们采用了在一个帐户上拥有多个提供商的方法,如标记为答案的响应中所述。

标签: firebasefirebase-authentication

解决方案


是的,电子邮件和密码凭据可能与现有 Firebase 帐户相关联。Firebase 网络文档描述了该过程,如下所示。

将电子邮件地址和密码凭据链接到用户帐户

要将电子邮件地址和密码凭据添加到现有用户帐户:

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

推荐阅读