【问题标题】:Firebase custom authentication how to choose unique user ID?Firebase 自定义身份验证如何选择唯一的用户 ID?
【发布时间】: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,然后我会使用它。

我不喜欢这种方法有两个原因:

  1. 虽然我可能会生成一个已经被占用的 ID 很小,理论上寻找“可用ID”的过程可以 采取很多步骤(最坏情况下的无限循环)。
  2. 一旦找到可用的 ID,我必须将其存储起来。鉴于所有这些调用都是异步的,我很有可能会创建一个具有合适 ID 的用户,但由于保存操作失败,我将无法使用此 ID。

那么,有谁知道如何为此类用例正确选择用户 ID?

【问题讨论】:

    标签: firebase authentication firebase-authentication uniqueidentifier jwt-auth


    【解决方案1】:

    生成具有足够熵(随机性)的字符串以从统计上保证它永远不会被复制是相当普遍的。例如,这在许多平台中存在的 UUID 生成器背后,同样在 Firebase 实时数据库的推送键和 Cloud Firestore 的 add() 键之后。如果您的平台中有一个,我建议从它开始。

    另见:

    【讨论】:

    • 我怎样才能在下次登录时重新创建相同的 UUID?还是您建议将其存放在桌子上?我一直认为 Firebase 通过以某种方式获取用户电子邮件、提供者名称和散列来创建用户 ID。该方法很棒,因为它可以很容易地重复,并且应该确保唯一的 ID,而无需将它们存储在关联表中。但是,由于我不知道详细的实现(源字符串中元素的顺序和散列函数),我冒着风险:)
    • 您需要存储用户凭据到其 UID 的映射。
    • 这也是 Firestore 在内部为其他提供商所做的吗? :)
    猜你喜欢
    • 2020-04-01
    • 2022-12-10
    • 1970-01-01
    • 2019-03-21
    • 1970-01-01
    • 1970-01-01
    • 2016-10-18
    • 2021-03-27
    • 1970-01-01
    相关资源
    最近更新 更多