首页 > 解决方案 > 在 Firestore 和 Firebase Auth 中处理用户数据的最佳方式配置为允许每封电子邮件有多个帐户

问题描述

我目前正在为我的 Firebase + Firestore + React 应用程序开发一个入门工具包。

我一直在试图找出为每个用户处理多种登录方法的最佳方法。

起初,我试图这样做,使用 Firebase Auth 并激活“每个电子邮件一个帐户”限制(这是默认设置)。

但是在多次尝试实现我的预期行为失败之后,我决定放弃并将我的 Firebase Auth 切换为“允许每封电子邮件多个帐户”

我的主要目标是:

如果我为我的用户提供 3 种注册和登录方法(例如:电子邮件/密码 + Google + Facebook),我觉得我应该尊重这 3 种方法,无论它们的使用顺序如何

事实上,“每个电子邮件一个帐户”的限制是不可能的,因为如果您的用户第一次使用电子邮件/密码注册,那么如果他下次使用 Google 注册,Firebase 将删除他的密码。而且它会默默地做到这一点,以至于您的用户永远不会知道他的密码为什么不再起作用(至少这是我从研究和 Firebase 支持的问题中了解到的)。

这是出于安全原因,因为 Google Provider 比其他提供商具有更高的优先级(在这种情况下,基本上是因为 Google 电子邮件返回隐式验证)。我明白了,但我只是认为,如果您删除用户的密码而不让他知道它发生了,那将是一个糟糕的用户体验。

我还有另一个更深入地探讨这个问题的问题

但是这里有这个问题,我想知道以下内容:

虽然允许每个用户使用多个帐户,但我必须将用户的数据保存在 Firestore 上,使用他们的emailas their uniqueID,因为每封电子邮件使用多个帐户/登录方法,每个帐户最终都会uid由 Firebase Auth 生成不同的系统,但他们都应该可以访问我的应用程序上的同一个帐户,因此我必须将它们email用作uniqueID)。

注意:从我的应用的角度来看:Firebase Auth 上使用相同电子邮件地址的每个帐户对应于同一个用户。

例如:

  1. myUser@gmail.com 使用电子邮件密码注册(发送链接以验证他的电子邮件)

  2. Firebase Auth 为 myUser@gmail.com/email-password 创建一个帐户。uid = x

  3. myUser@gmail.com 使用 Google 登录进行注册

  4. Firebase 身份验证为 myUser@gmail.com/google-sign-in 创建另一个帐户。uid = y

  5. myUser@gmail.com 使用 Facebook 登录

  6. Firebase 身份验证为 myUser@gmail.com/facebook-sign-in 创建另一个帐户。uid = z

由于每个帐户都有不同的uid,我将让他们都可以使用他们的emailas访问 Firestore 上的相同数据uniqueID,在这种情况下,每个帐户都是相同的。

问题

虽然这似乎解决了我的问题,但我担心将来可能带来的并发症。你们中的任何一个,更有经验的 Firebase 开发人员,可能会想到我不应该使用上述方法解决问题的原因?

请记住,从我的应用程序的角度来看:“用户是电子邮件”,而不是 Firebase Auth 上的帐户。每个用户可能有 1、2 或 3 个 Firebase 身份验证帐户。

您是否看到潜在的问题/冲突:

谢谢您的帮助。

标签: reactjsfirebasefirebase-authenticationgoogle-cloud-firestore

解决方案


我认为您所描述的设置没有任何问题 - 此外,由于他们的电子邮件是您拥有的唯一共享身份信息 - 您没有太多选择。只要您基于电子邮件地址构建所有内容......跳过与firebase生成的UID相关的任何内容,那么它应该没问题。

我要给您的一个警告是,当您将电子邮件地址写入数据库时​​,您应该注意从电子邮件地址中去除一些特殊字符。这些数据库文档包含有关 Firebase 数据库密钥中不允许使用的字符的信息:

如果您创建自己的密钥,它们必须是 UTF-8 编码的,最多可以是 768 个字节,并且不能包含 .、$、#、[、]、/ 或 ASCII 控制字符 0-31 或 127。您不能在值本身中使用 ASCII 控制字符。

其中许多是电子邮件地址的有效部分

这是我能想到的一个重要的警告项目,否则你应该做好准备。免责声明我在 FCM 方面没有太多经验,因此如果您希望在以后的某个时候添加移动客户端,我可能还没有注意到另一个考虑因素。


推荐阅读