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

时间:2019-01-27 19:16:33

标签: javascript reactjs firebase firebase-authentication

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

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

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

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

Example1(效果很好):

  1. 用户首次在Google中注册
  2. 完美!我得到了他的详细信息,并使用由auth系统创建的用户ID将其写入Firestore。
  3. 用户现在尝试使用他的电子邮件/密码(与他在Google的第一次注册中的电子邮件相同)再次注册
  4. 我收到一条错误消息,说该电子邮件正在使用中,我让用户知道他已经在Google上注册,并要求他再次在Google上登录
  5. 然后,一旦他登录Google,我就让他在自己的帐户页面中创建一个密码。
  6. 我将使用该密码,并将其链接到他首次与Google签约时所使用的他先前存在的帐户(他目前已登录)。
  7. 太好了!现在,我有一个可以使用Google或他的密码登录的用户。

示例2(问题):

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

Google Group - Firebase Talk - About this issue

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

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

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

Firebase Help - Allow multiple accounts with the same email address

从上面链接的帮助页面:

  

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

从上面的摘录中,我了解到,如果我以前使用电子邮件/密码组合创建了该帐户,那么我将无法使用该帐户创建该帐户。但这并非如此,如示例2所示。非常奇怪!

现在是真实的问题:

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

例如:

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

johndoe@gmail.com / Google登录=用户ID Y

johndoe@gmail.com / Facebook登录=用户ID Z

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

但是由于我还处于开发初期,所以这似乎有些“ hacky”,将来我可能会带来一些麻烦。

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

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

还有其他想法或意见吗?

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

1 个答案:

答案 0 :(得分:2)

一种选择是强制密码的用户,他们注册之后,以验证他们的电子邮件地址。在这个例子#2,将火力地堡的继续帐户的现有密码如果的电子邮件地址已验证例如通过发送验证链接到的电子邮件地址和用户点击的链接。