在 Firestore 和 Firebase Auth 中处理用户数据的最佳方式配置为允许每封电子邮件有多个帐户
Posted
技术标签:
【中文标题】在 Firestore 和 Firebase Auth 中处理用户数据的最佳方式配置为允许每封电子邮件有多个帐户【英文标题】:Best way to handle user data in Firestore and Firebase Auth configured to allow multiple accounts per email 【发布时间】:2019-06-25 07:35:53 【问题描述】:我目前正在为我的 Firebase + Firestore + React 应用程序开发一个入门工具包。
我一直在努力找出为每个用户处理多种登录方法的最佳方法。
起初,我尝试这样做,使用 Firebase 身份验证并激活“每个电子邮件一个帐户”限制(这是默认设置)。
但在多次尝试实现我的预期行为失败后,我决定放弃并将我的 Firebase 身份验证切换为“允许每封电子邮件多个帐户”。
我的主要目标是:
如果我为我的用户提供 3 种注册和登录方法(例如:电子邮件/密码 + Google + Facebook),我觉得我应该尊重这 3 种方法不管他们可能的顺序已使用。
事实上,“每个电子邮件一个帐户”的限制是不可能的,因为如果您的用户第一次使用电子邮件/密码注册,如果他下次使用 Google 注册,Firebase 将删除他的密码.它会默默地做到这一点,以至于您的用户永远不会知道为什么他的密码不再起作用(至少这是我从我的研究和 Firebase 支持的问题中了解到的)。
这是出于安全原因,因为 Google Provider 的优先级高于其他提供商(在这种情况下,基本上是因为 Google 电子邮件返回时已隐式验证)。我明白了,但我只是认为,如果您删除用户的密码而不让他知道发生了这种情况,那将会给用户带来糟糕的体验。
I have another question that goes deeper into this issue
但是在这里我想知道以下问题:
虽然允许每个用户使用多个帐户,但我必须使用他们的 email
作为 uniqueID
将用户的数据保存在 Firestore 上,因为每封电子邮件使用多个帐户/登录方法,每个帐户都会结束由 Firebase Auth 系统生成不同的uid
,但他们都应该可以访问我的应用程序上的同一个帐户,因此我必须使用他们的email
作为uniqueID
)。
注意:从我的应用的角度来看:Firebase Auth 上使用相同电子邮件地址的每个帐户对应于相同的用户。
例如:
myUser@gmail.com 使用电子邮件密码注册(发送链接以验证他的电子邮件)
Firebase 身份验证为 myUser@gmail.com/email-password 创建一个帐户。 uid = x
myUser@gmail.com 使用 Google 登录进行注册
Firebase 身份验证会为 myUser@gmail.com/google-sign-in 创建另一个帐户。 uid = y
myUser@gmail.com 使用 Facebook 登录进行注册
Firebase 身份验证会为 myUser@gmail.com/facebook-sign-in 创建另一个帐户。 uid = z
由于每个帐户都有不同的uid
,因此我将让他们都可以使用email
和uniqueID
访问Firestore 上的相同数据,在这种情况下,每个帐户都是相同的.
问题
虽然这似乎可以解决我的问题,但我担心将来可能带来的并发症。你们中的任何一位,更有经验的 Firebase 开发人员,可能会想到我不应该使用上述方法解决问题的原因吗?
请记住,从我的应用的角度来看:“用户是电子邮件”,而不是 Firebase Auth 上的帐户。每个用户可能有 1、2 或 3 个 Firebase 身份验证帐户。
您是否看到以下方面的潜在问题/冲突:
Firestore 安全规则? Firebase 的云功能? 一些 firebase-admin 案例? 某种消息系统冲突? 我不知道...我在这里集思广益。感谢您的帮助。
【问题讨论】:
您打算如何获取电子邮件地址?如果您“允许每封电子邮件有多个帐户”,那么提供商将不会返回电子邮件地址。 在此处获取它们:userCredential.user.providerData[0].email
在响应中查找 prodiverData
数组。
您是否已经尝试过这个。一旦我切换到“每封电子邮件允许多个帐户”,我就停止在提供商数据中获取电子邮件(谷歌登录)。我必须使用登录请求添加一个新范围。其他提供商也不提供电子邮件地址(雅虎、推特)
我没有深入探讨这个问题。我使用的唯一提供商是 Google,我可以使用 providerData
属性获取用户详细信息。我听说如果您强制用户验证他的电子邮件,那么以后的 Google 登录不会删除他之前创建的 email/password
帐户。由于我的问题是静默删除使用email/password
创建的第一个帐户,我可能会这样做(确保电子邮件验证)并返回“每封电子邮件一个帐户”。
好的,我可以通过编辑我的 twitter 应用程序来请求访问用户的电子邮件,从而从 twitter 获取电子邮件。但我仍然无法弄清楚如何从 yahoo 获取它(它不在提供程序数据中)
【参考方案1】:
我认为您所描述的设置没有任何问题 - 此外,由于他们的电子邮件是您拥有的唯一共享身份信息 - 您没有太多选择。只要您根据电子邮件地址构建所有内容...跳过与 firebase 生成的 UID 相关的任何内容,那么应该没问题。
我要给您的一个警告是,当您将电子邮件地址写入数据库时,您应该注意从电子邮件地址中去除一些特殊字符。 These database docs 在 Firebase 数据库键中包含有关不允许字符的信息:
如果您创建自己的密钥,它们必须是 UTF-8 编码的,可以是 最多 768 个字节,并且不能包含 .、$、#、[、]、/ 或 ASCII 控制字符 0-31 或 127。不能使用 ASCII 控制 值本身中的字符。
其中许多是valid portions of an email address。
这是我能想到的一个重要的警示项目,否则你应该做好准备。免责声明我在 FCM 方面没有太多经验,因此如果您希望在以后的某个时间添加移动客户端,我可能还没有注意到另一个考虑因素。
【讨论】:
以上是关于在 Firestore 和 Firebase Auth 中处理用户数据的最佳方式配置为允许每封电子邮件有多个帐户的主要内容,如果未能解决你的问题,请参考以下文章
在中国使用 Firebase 身份验证和 Firestore
在 Flutter 应用程序上过滤和排序 Firebase (Firestore) 数据