如何在 Firebase 中处理同一用户的多种登录方法?

cbd*_*per 5 javascript firebase reactjs firebase-authentication

我目前正在使用 Firebase 开发身份验证系统。我希望我的系统接受电子邮件/密码、Google 和 Facebook 作为注册和登录方法。

到目前为止,一切都很好。当用户分别使用每种方法进行注册时,一切都会正常进行。当用户想要使用另一种方法注册并且我需要将新方法链接到同一用户之前使用另一种方法注册的同一帐户时,问题就开始了。

我的示例将仅提及电子邮件/密码和 Google 方法。

注意:我的 Firebase 身份验证系统设置为每封电子邮件仅接受 1 个帐户。

示例1(工作正常):

  1. 用户首次在 Google 注册
  2. 完美的!我获取他的详细信息,并使用身份验证系统创建的用户 ID 将其写入 Firestore。
  3. 用户尝试再次注册,现在使用他的电子邮件/密码(与他第一次在 Google 注册时使用的电子邮件相同)
  4. 我收到一条错误消息,提示该电子邮件正在使用中,我让用户知道他已经在 Google 上注册,并要求他再次使用 Google 登录
  5. 然后,当他登录 Google 后,我让他在帐户页面内创建一个密码。
  6. 我将获取该密码并将其链接到他首次在 Google 注册时创建的现有帐户(他当前已登录)。
  7. 伟大的!现在我有一个可以使用 Google 或其密码登录的用户。

示例2(问题):

  1. 用户首次使用他的电子邮件/密码注册。请注意,他的电子邮件来自 Google (gmail)。
  2. 完美的!我获取他的详细信息,并使用身份验证系统创建的用户 ID 将其写入 Firestore。
  3. 用户尝试再次注册,现在使用 Google 登录方法(使用相同的电子邮件)。
  4. 显然一切正常,用户登录也很好。
  5. 但事实是,在没有任何警告的情况下,Firebase 身份验证已经放弃了他的电子邮件/密码方法,只用 Google 登录方法取而代之。

Google 群组 - Firebase Talk - 关于此问题

从上面的链接和 StackOverflow 上的其他一些相关问题,我了解到这种行为是由于安全问题而出现的,这就是为什么 Google 比其他身份验证提供商拥有“更高的优先级”,因为您可以真正信任这些用户并且他们的电子邮件。

但删除用户创建的密码对我来说似乎是错误的。更不用说在没有任何警告的情况下这样做了。

而且,这似乎与以下 Firebase 帮助页面冲突:

Firebase 帮助 - 允许多个帐户使用同一电子邮件地址

从上面链接的帮助页面:

您可以配置用户是否可以创建使用相同电子邮件地址但链接到不同登录方法的多个帐户。例如,如果您不允许多个帐户使用同一电子邮件地址,则用户无法创建使用电子邮件地址为 ex@gmail.com 的 Google 帐户登录的新帐户(如果已有帐户使用该帐户登录)电子邮件地址 ex@gmail.com 和密码。

从上面的摘录中,我了解到的是,如果我之前使用电子邮件/密码组合创建了该帐户,则我不应该能够使用 Google 创建该帐户。但事实并非如此,如示例 2 所示。非常奇怪!

现在真正的问题是:

由于我无法更改 Firebase 行为,因此我正在考虑更改 Firebase 身份验证系统,以允许每个电子邮件有多个帐户,并使用电子邮件作为主键(而不是使用Firebase 身份验证系统),因为在 Firebase 身份验证系统中,电子邮件/登录方法的每种组合都将被视为不同的帐户,因此每个组合都将具有不同的 userID。

前任:

johndoe@gmail.com / 密码 = 用户 ID X

johndoe@gmail.com / Google 登录 = UserID Y

johndoe@gmail.com / Facebook 登录 = UserID Z

上述所有帐户都将使用 johndoe@gmail.com 作为“主键”(集合)在 Firestore 中存储和访问数据。

但由于我还处于开发早期,这似乎有点“hacky”,我可能会在未来带来一些复杂性。

你有什么建议吗?这里的主要目标是让我的用户使用他们想要的任何方法进行注册和登录。所有方法都应该允许他们访问我的应用程序中的数据(将位于 Firestore 中)。

我拒绝默默删除用户之前创建的密码,只是为了让他们注册并加入 Google。

还有其他想法或评论吗?

抱歉问了这么长的问题,但我认为它很好地说明了问题。

Jin*_*Liu 3

一种选择是强制密码用户在注册后立即验证其电子邮件地址。在示例 #2 中,如果电子邮件地址已通过验证(例如通过向电子邮件地址发送验证链接并且用户已点击该链接), Firebase 将保留帐户的现有密码。