社交身份验证提供商未返回用户电子邮件

Ven*_*son 11 javascript database database-design oauth-2.0

这是一个架构问题而不是技术问题。我们的网络和移动应用程序完全依赖于社交认证,我们正在使用社交认证提供商,例如GoogleFacebook等。

用户成功登录后,Google 和 Facebook 等提供商会通过电子邮件和唯一 ID 返回用户数据。我们将该数据存储在数据库中,如下所示。

+----+--------------------------------------------------------------+---------------+----------+
| id | socialId                                                     | email         | provider |
+----+--------------------------------------------------------------+---------------+----------+
| 1  | $2a$12$Qx.FVkgYkXqJGF4PyJ1kb.JlSDe9bV6TJFodpTx2eBsYxvqn6Gywa | a@example.com | Facebook |
+----+--------------------------------------------------------------+---------------+----------+
| 2  | $2a$12$N2fCTRxymPlcaID5oP617OJTXkrvKAHZ/taFJ.lePZddfW3E6U.Fe | b@example.com | Google   |
+----+--------------------------------------------------------------+---------------+----------+
Run Code Online (Sandbox Code Playgroud)

所有数据库字段都是必需的且不能为空。

注意:出于安全原因,我们还socialIds以哈希格式存储,存储电子邮件有助于我们了解用户是新用户还是老用户,并有助于防止重复记录。

但有一个问题,有些提供商没有返回用户电子邮件。

所以识别用户是新用户还是老用户就成了一个问题,同时也造成了重复行的风险。

解决这个问题的最佳方法是什么?将 ID 以原始形式存储在数据库中是否合适?

Gar*_*her 2

好问题,这里有一些架构要点:

应用程序级别帐户链接

感觉当您不确定用户的身份时,您可能需要在登录返回时提示用户。一种选择可能是一个Complete Your Profile捕获信息的屏幕,使您能够在需要时将帐户链接在一起。

当然,如果您要求提供电子邮件、电话等,则需要验证用户是否拥有它,例如通过电子邮件或短信验证,因此您需要将该管道添加到您的应用程序中。

另请记住,社交提供商可能已要求用户同意使用其用户名而不是电子邮件,因此您应该向用户解释为什么您的应用需要额外信息。

授权服务器帐户链接

出于兴趣,作为长期解决方案,使用授权服务器 (AS) 可以将应用程序中的所有这些管道外部化并改进架构。

AS 可以管理社交提供商的差异,以便您的应用程序和用户获得相同的质量,无论登录方式如何:

  • 一致性代币,仅由AS发行
  • UI 中一致的会话生命周期
  • API 收到的令牌中一致的范围和声明
  • 数据库中一致的机密用户 ID,如PPID
  • 添加新的身份验证方法需要在任何应用程序中进行零代码更改

您自己的用户数据可能如下所示,或者您可以将自己的用户 ID 添加到已发行的令牌中,这样您就根本不需要存储。

域特定用户 ID PPID
1 通用唯一标识1
2 统一识别​​码2

授权服务器还可以在应用程序的个人身份信息 (PII) 的外部化管理方面发挥相当大的作用 - 正如本文所讨论的。

链接逻辑仍然需要实现,因为 OAuth 是一个框架而不是开箱即用的解决方案。但是一个好的 AS(免费/付费)将为您提供此类解决方案的更大构建块 - 例如,可以包括提示用户的操作。

在提交到 AS 之前要检查的关键是它满足您的用例并且您的应用程序不存在阻塞问题。