我目前正在使用Firebase开发身份验证系统.我希望我的系统接受电子邮件/密码,Google和Facebook作为注册和登录方法.
到现在为止还挺好.当用户分别注册每种方法时,一切都很好.当用户想要使用另一种方法注册时,问题就开始了,我需要将新方法链接到同一用户先前使用另一种方法注册的同一帐户.
注意:我的Firebase身份验证系统设置为每封电子邮件仅接受1个帐户.
Example1(工作正常):
>用户首次在Google注册
>完美!我得到了他的详细信息,并使用auth系统创建的用户ID将其写入Firestore.
>用户现在尝试使用他的电子邮件/密码再次注册(与他第一次在Google注册时使用的电子邮件相同)
>我收到一条错误消息,说该电子邮件正在使用中,我让用户知道他已经在Google注册,并要求他再次使用Google登录.
>然后,一旦他使用Google登录,我就让他在自己的帐户页面中创建一个密码.
>我将使用该密码,并将其链接到他首次与Google进行注册时所使用的现有帐户(他目前已登录).
>太好了!现在,我有一个可以使用Google或他的密码登录的用户.
示例2(问题):
>用户首次使用他的电子邮件/密码注册.请注意,他的电子邮件是来自Google(gmail)的电子邮件.
>完美!我得到了他的详细信息,并使用auth系统创建的用户ID将其写入Firestore.
>用户现在尝试使用Google登录方法(使用相同的电子邮件)再次注册.
>显然一切正常,用户登录就可以了.
>但事实是,在没有任何警告的情况下,Firebase身份验证已放弃了他的电子邮件/密码方法,仅用Google登录方法代替了它.
Google Group – Firebase Talk – About this issue
通过上面的链接以及此处有关StackOverflow的其他一些相关问题,我了解到,这种行为是由于安全问题而引起的,这就是为什么Google相对于其他身份验证提供程序具有“更高的优先级”的原因,因为您可以真正信任这些用户并他们的电子邮件.
但是删除用户创建的密码对我来说似乎是错误的.更不用说没有任何警告.
而且,这似乎与以下Firebase帮助页面冲突:
Firebase Help – Allow multiple accounts with the same email address
You can configure whether users can create multiple accounts that use
the same email address,but are linked to different sign-in methods.
For example,if you don’t allow multiple accounts with the same email
address,a user cannot create a new account that signs in using a
Google Account with the email address ex@gmail.com if there already is
an account that signs in using the email address ex@gmail.com and a
password.
从上面的摘录中,如果我以前使用电子邮件/密码组合创建了该帐户,那我将无法使用Google创建该帐户.但这并非如示例2所示.这很奇怪!
现在真正的问题是:
由于我无法更改Firebase的行为,因此我正在考虑更改Firebase身份验证系统,以允许每个电子邮件使用多个帐户,并使用他们的电子邮件作为主键来处理Firestore中的所有用户数据(而不是使用用户ID作为(Firebase身份验证系统),因为电子邮件/登录方法的每种组合都将被视为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.
还有其他想法或意见吗?
很长的问题很抱歉,但是我认为它很好地说明了这个问题.