reactjs - 在 Firestore 和 Firebase Auth 中处理用户数据的最佳方式配置为允许每封电子邮件有多个帐户
问题描述
我目前正在为我的 Firebase + Firestore + React 应用程序开发一个入门工具包。
我一直在试图找出为每个用户处理多种登录方法的最佳方法。
起初,我试图这样做,使用 Firebase Auth 并激活“每个电子邮件一个帐户”限制(这是默认设置)。
但是在多次尝试实现我的预期行为失败之后,我决定放弃并将我的 Firebase Auth 切换为“允许每封电子邮件多个帐户”。
我的主要目标是:
如果我为我的用户提供 3 种注册和登录方法(例如:电子邮件/密码 + Google + Facebook),我觉得我应该尊重这 3 种方法,无论它们的使用顺序如何。
事实上,“每个电子邮件一个帐户”的限制是不可能的,因为如果您的用户第一次使用电子邮件/密码注册,那么如果他下次使用 Google 注册,Firebase 将删除他的密码。而且它会默默地做到这一点,以至于您的用户永远不会知道他的密码为什么不再起作用(至少这是我从研究和 Firebase 支持的问题中了解到的)。
这是出于安全原因,因为 Google Provider 比其他提供商具有更高的优先级(在这种情况下,基本上是因为 Google 电子邮件返回隐式验证)。我明白了,但我只是认为,如果您删除用户的密码而不让他知道它发生了,那将是一个糟糕的用户体验。
但是这里有这个问题,我想知道以下内容:
虽然允许每个用户使用多个帐户,但我必须将用户的数据保存在 Firestore 上,使用他们的email
as their uniqueID
,因为每封电子邮件使用多个帐户/登录方法,每个帐户最终都会uid
由 Firebase Auth 生成不同的系统,但他们都应该可以访问我的应用程序上的同一个帐户,因此我必须将它们email
用作uniqueID
)。
注意:从我的应用的角度来看:Firebase Auth 上使用相同电子邮件地址的每个帐户对应于同一个用户。
例如:
myUser@gmail.com 使用电子邮件密码注册(发送链接以验证他的电子邮件)
Firebase Auth 为 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
as访问 Firestore 上的相同数据uniqueID
,在这种情况下,每个帐户都是相同的。
问题
虽然这似乎解决了我的问题,但我担心将来可能带来的并发症。你们中的任何一个,更有经验的 Firebase 开发人员,可能会想到我不应该使用上述方法解决问题的原因?
请记住,从我的应用程序的角度来看:“用户是电子邮件”,而不是 Firebase Auth 上的帐户。每个用户可能有 1、2 或 3 个 Firebase 身份验证帐户。
您是否看到潜在的问题/冲突:
- Firestore 安全规则 ?
- Firebase 的云功能?
- 一些firebase-admin案例?
- 某种消息系统冲突?
- 我不知道...我在这里集思广益。
谢谢您的帮助。
解决方案
我认为您所描述的设置没有任何问题 - 此外,由于他们的电子邮件是您拥有的唯一共享身份信息 - 您没有太多选择。只要您基于电子邮件地址构建所有内容......跳过与firebase生成的UID相关的任何内容,那么它应该没问题。
我要给您的一个警告是,当您将电子邮件地址写入数据库时,您应该注意从电子邮件地址中去除一些特殊字符。这些数据库文档包含有关 Firebase 数据库密钥中不允许使用的字符的信息:
如果您创建自己的密钥,它们必须是 UTF-8 编码的,最多可以是 768 个字节,并且不能包含 .、$、#、[、]、/ 或 ASCII 控制字符 0-31 或 127。您不能在值本身中使用 ASCII 控制字符。
其中许多是电子邮件地址的有效部分。
这是我能想到的一个重要的警告项目,否则你应该做好准备。免责声明我在 FCM 方面没有太多经验,因此如果您希望在以后的某个时候添加移动客户端,我可能还没有注意到另一个考虑因素。
推荐阅读
- android - 使用字符串资源创建超链接
- r - 用字符串减去列
- ios - Swift - 打字时TextView高度和宽度发生变化
- ios - 视图转到表格视图,表格不起作用
- c++ - 在 C++ 中使用 Qt 在 Linux 上连接到 Oracle DB
- ios - UIView.animate 已更改,我需要帮助来为我的应用复制动画
- php - 在 Laravel 中发布多个具有相同名称的字段
- python - 如何使用硒打开特定链接?
- api - 在 ModelsBuilder API 模式下在 Umbraco 7.6 中生成模型时出错
- ruby-on-rails - 是否可以通过 API 为有房地产计划的账户启用 DocuSign 的删除线功能?