如何将多个身份验证提供程序链接到 Firebase 帐户?

Posted

技术标签:

【中文标题】如何将多个身份验证提供程序链接到 Firebase 帐户?【英文标题】:How to Link Multiple Auth Providers to an Firebase Account? 【发布时间】:2016-10-12 14:51:46 【问题描述】:

我无法成功,我按照 Firebase 文档中的说明执行了以下步骤:

    使用现有的身份验证提供程序登录使用(我的案例:facebook)。 为新的身份验证提供程序完成登录流程,直至但不包括调用Auth.signInWith 方法之一。(我的情况:我想将电子邮件和密码与 Google OAUth 关联起来)。所以这是我不清楚的步骤,我使用 var provider = new firebase.auth.GoogleAuthProvider(); 创建了一个新的提供程序,但我没有这样做 Firebase.auth().signInWithPopup(provider) 。 然后为了获得 google 的 authcredential,我运行 var credential = firebase.auth.GoogleAuthProvider.credential( googleUser.getAuthResponse().id_token);我得到一个未定义的 googleUser 错误)这个错误似乎是合适的,因为我没有使用 Google Oauth 登录,但这就是第二步所说的(不要登录) 然后此命令链接到 Facebook 提供商 auth.currentUser.link(credential) 上的当前用户

我的理解是 currentUser 需要链接到我现有的 Provider(Facebook)。似乎从未计算过 google 的凭据变量。任何有功能代码示例的人都会有帮助。

【问题讨论】:

【参考方案1】:

如果您想手动将 google 和电子邮件/pass 帐户链接到现有的仅限 facebook 的 firebase 用户,您可以执行以下操作: 首先,用户应该登录到 Facebook。 链接谷歌用户:

var provider = new firebase.auth.GoogleAuthProvider();
auth.currentUser.linkWithPopup(provider);

然后链接邮箱/pass账号:

auth.currentUser.linkWithCredential(firebase.auth.EmailAuthProvider.credential(auth.currentUser.email, 'password'))

所有这些要关联的帐户必须是新的且尚未关联。

【讨论】:

不完全是。我想我没有解释清楚。我的意思是手动,因为开发人员根据某些需要选择链接(需要谷歌提供商访问谷歌日历、升级匿名用户等)。另一种情况是后端服务器出于安全原因需要它。例如,您使用返回 xyz@gmail.com 的 google 登录到 firebase。然后,用户使用 facebook 在单独的设备上登录,该设备返回相同的电子邮件 xyz@gmail.com。在这种情况下,会引发一个错误,表明凭证已在使用中。在这种情况下,您需要关联帐户才能关联两个提供商。 @bojeil 另外,如果用户在使用 Facebook 登录后退出,然后决定使用 Google 登录怎么办?那我可以把他和谷歌联系起来吗? 如果您已经拥有 oauth 凭据,则使用 linkWithCredential。这里的优点是您不需要打开弹出窗口或重定向。如果您在项目设置中设置了“每封电子邮件一个帐户”。如果用户最初使用电子邮件登录,然后使用返回相同电子邮件的 OAuth 提供商登录,则后端将抛出帐户存在的错误。您必须登录第一个帐户,然后将 OAuth 提供者帐户链接到该帐户。 Google 是一种特殊情况,因为拥有 google 电子邮件的用户被认为是经过验证的(由 Google 颁发帐户)并将覆盖现有的 facebook 帐户而无需链接。 对于 react-native,您需要获取要链接、初始化和 Firebase AuthCredential 的帐户的 OAuth 凭据,然后使用 linkWithCredential,因为该环境不支持弹出/重定向操作。 【参考方案2】:

@bojeil 我已经阅读了您的问题,并且找到了使用相同电子邮件帐户登录 Google 和 Facebook 登录的方法。首先,在 Firebase 中,您需要允许

“每个电子邮件地址有多个帐户”

Allow multiple accounts per email address

现在您可以使用具有“xyz@gmail.com”的 Facebook 和具有与“xyz@gmail.com”相同的电子邮件名称的 Google 登录。但是您将在第二次登录时遇到电子邮件为“null”相同的电子邮件。您可以使用下面的 sn-p 解决 null 问题。

只需在 firebase 的成功任务中使用这个 sn-p:

地图配置文件 = task.getResult().getAdditionalUserInfo().getProfile();

对象 email = profile.get("email"); /// 虽然我们使用相同的电子邮件形式 facebook 和 Google 登录帐户,但从使用中获取电子邮件。

通过这种方式,您可以使用同一电子邮件登录 Facebook 和 Google 登录。

希望您能通过此信息消除疑虑。如果这适合您的问题,您能回复我吗?

谢谢。

【讨论】:

但这将为每个提供商创建多个 Firebase ID - 因此名称为“多个帐户”。对于希望每个电子邮件地址拥有一个帐户的开发人员(无论提供商如何),请不要这样做 如果有人想要包含 google 和 Facebook 的相同电子邮件,那么这就是@MichaelBolboceanu 的解决方案 完全同意@MichaelBolboceanu。 这会在您的数据库中造成混乱。与将 1 个电子邮件地址链接到多个提供商不同,您最终会为每个提供商拥有多个相同电子邮件地址的条目。因此,如果用户使用同一电子邮件通过 google、facebook 和 twitter 登录,您最终会在数据库中为该用户提供三个单独的条目。

以上是关于如何将多个身份验证提供程序链接到 Firebase 帐户?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Firebase 身份验证链接到实时数据库?

如何使用 Firebase 登录多个社交服务?

将 Firebase 身份验证与自定义提供程序一起使用

Firebase UI 身份验证提供程序 iOS Swift 示例

Firebase 身份验证中的用户 ID 如何在所有身份验证提供程序(Google、Facebook、Github)中都相同?

Firebase 身份验证链接不起作用 - 缺少尾部斜杠?