【发布时间】:2020-07-17 22:29:27
【问题描述】:
Firebase 非常棒,因为它提供了许多身份验证提供程序。在我的一个应用程序中,我使用了 Firebase 提供的四种不同的提供商(电子邮件、Twitter、Facebook 和 Google),但我还需要让用户通过 LinkedIn 登录。
由于 Firebase SDK 不提供 LinkedIn,我需要手动实现登录流程,这似乎并不难,但我看到了一个大问题。在创建自定义 JWT 令牌期间,我需要分配一个用户 ID。而且我不知道如何生成一个,同时确保我的方法不会与 Firebase 自己为其他提供商生成的用户 ID 冲突。
例如,假设用户 Andriy Gordiychuk 通过 LinkedIn 登录,他的电子邮件地址是 andriy@gordiychuk.com。创建用户 ID 的一种简单方法是获取电子邮件地址 (andriy@gordiychuk.com) 并使用一些散列函数对其进行随机化。我会得到一些随机 id,例如 aN59nlphs...,只要同一个用户登录,我就可以重新创建它。到目前为止,一切都很好。
但是,例如,我如何确定我获得的 ID 没有被其他通过 Twitter 登录的用户使用?
缓解此问题的一种方法是将 LinkedIn 用户 ID 存储在 Firestore 集合中。然后,当我需要创建令牌时,我首先检查我是否已经拥有该用户的 ID。如果没有,我会对电子邮件地址进行哈希处理,并尝试使用此 ID 创建一个用户。如果这个 ID 已经被占用,我会尝试创建另一个 ID,直到我偶然发现一个未被占用的 ID,然后我会使用它。
我不喜欢这种方法有两个原因:
- 虽然我可能会生成一个已经被占用的 ID 很小,理论上寻找“可用ID”的过程可以 采取很多步骤(最坏情况下的无限循环)。
- 一旦找到可用的 ID,我必须将其存储起来。鉴于所有这些调用都是异步的,我很有可能会创建一个具有合适 ID 的用户,但由于保存操作失败,我将无法使用此 ID。
那么,有谁知道如何为此类用例正确选择用户 ID?
【问题讨论】:
标签: firebase authentication firebase-authentication uniqueidentifier jwt-auth