我目前正在为我的Firebase + Firestore + React应用程序开发入门套件。
我一直在努力寻找为每个用户处理多种登录方法的最佳方法。
起初,我尝试使用Firebase Auth并启用“每个电子邮件一个帐户”的限制(这是默认设置)。
但是在尝试完成我的预期行为失败很多之后,我决定放弃并将Firebase身份验证切换为“每个电子邮件允许多个帐户” 。
我的主要目标是:
如果我为我的用户提供3种注册和登录方法(例如:电子邮件/密码+ Google + Facebook),我认为我应该尊重这3种方法,无论他们可能选择的顺序如何已使用。
这实际上是不可能的,因为“限制每个电子邮件一个帐户”的限制,因为如果您的用户首次使用电子邮件/密码进行注册,那么Firebase如果在下次使用Google进行注册时会删除其密码。它会如此默默地执行此操作,以至于您的用户将永远不知道为什么密码不再起作用了(至少从我的研究以及对Firebase支持的问题中我了解到这一点)。
这是出于安全原因,因为Google Provider的优先级高于其他提供商(主要是因为Google电子邮件在这种情况下会被隐式验证回来)。我明白了,但我只是认为,如果在不通知用户密码的情况下删除用户密码,将会给用户带来糟糕的体验。
I have another question that goes deeper into this issue
但是在这里有这个问题时,我想了解以下内容:
虽然每个用户可以使用多个帐户,但我必须将用户的数据email
用作uniqueID
,将其数据保存在Firestore上,因为每个电子邮件使用多个帐户/登录方法,每个帐户最终将拥有由Firebase Auth系统生成的不同的uid
,但它们都应有权访问我的应用程序中的同一帐户,因此,我必须将其email
用作{ {1}})。
注意:从我的应用程序的角度来看:Firebase Auth上使用相同电子邮件地址的每个帐户都对应同一用户。
例如:
myUser@gmail.com使用电子邮件密码进行注册(发送链接以验证其电子邮件)
Firebase Auth为myUser@gmail.com/email-password创建一个帐户。 uniqueID
myUser@gmail.com使用Google登录进行注册
Firebase身份验证为myUser@gmail.com/google-sign-in创建另一个帐户。 uid = x
myUser@gmail.com使用Facebook登录进行注册
Firebase身份验证为myUser@gmail.com/facebook-sign-in创建另一个帐户。 uid = y
由于每个帐户都有不同的uid = z
,因此我将让他们所有人都使用uid
和email
来访问Firestore上的相同数据,这对于每个帐户,在这种情况下。
问题
尽管似乎可以解决我的问题,但我担心将来可能会出现复杂情况。你们中任何一位经验丰富的Firebase开发人员,可能会想到我不应该使用上述方法解决问题的原因?
请记住,从我的应用程序的角度来看:“用户就是电子邮件” ,而不是Firebase Auth上的帐户。每个用户在Firebase Auth上可能拥有1个,2个或3个帐户。
您是否看到以下潜在问题/冲突?
感谢您的帮助。
答案 0 :(得分:1)
我看不到您描述的设置有任何问题-而且,由于他们的电子邮件是您拥有的唯一共享身份信息,因此您选择的余地并不大。只要你组织根据各地的电子邮件地址一切......跳过相关的火力点产生的UID话,那么它应该是罚款。
一个警告,我给你的是,你应该特别注意从电子邮件地址,剔除一些特殊字符,当你在数据库中写。 These database docs包含有关Firebase数据库密钥中不允许使用的字符的信息:
如果您创建自己的密钥,则它们必须是UTF-8编码的,可以是 最大768个字节,并不能包含。,$,#,[,],/,或ASCII 控制字符0-31或127。不能使用ASCII控制 中的值字符本身,无论是。
其中许多是valid portions of an email address。
这是我可以想到的一项重大警告事项,否则您应该表现出色。免责声明我在FCM方面没有太多经验,因此,如果您想在将来的某个时间添加移动客户端,可能还有我没有注意到的其他考虑事项。