【问题标题】:How should I store OAuth with my own authentication system?我应该如何使用自己的身份验证系统存储 OAuth?
【发布时间】:2022-01-05 11:30:12
【问题描述】:

我有一个现有的注册/登录系统:用户输入电子邮件和密码。密码经过哈希处理。我将它存储在数据库中。

当用户登录时,他们会填写完整的电子邮件和密码。密码经过哈希处理,我在数据库中查找电子邮件并检查电子邮件是否匹配。如果是,则他们已登录。

我想添加一个系统,让用户使用 GitHub 等 3rd 方 OAuth 登录。我有那个设置,但我不确定要在我的数据库中存储哪些数据。

我在想我将他们的 GitHub 电子邮件作为电子邮件,然后使用他们 GitHub 的访问令牌作为密码(所以我会对其进行哈希处理并存储它。)

我认为这可行,但我担心访问令牌可能会改变,这意味着他们将被锁定在他们的帐户之外。

如果我不应该使用访问令牌作为密码,我应该使用什么?我需要将用户的电子邮件存储在我的数据库中,但目前需要密码,如果他们使用 GitHub 登录,我无法获得。

(请注意,当用户登录时,我会调用我的后端来生成访问令牌 (JWT),我可以使用它来获取他们的用户详细信息,然后将其存储在本地存储中。我希望能够用 GitHub 或其他东西做同样的事情。)

【问题讨论】:

  • 为什么一定要保存密码?如果您使用 oAuth,则不必存储密码;你得到了访问令牌,就是这样。你的应用需要访问 github 吗?或者换句话说:你也可以使用 Facebook/LinkedIn 的 oAuth 吗?
  • '我调用我的后端来生成一个访问令牌 (JWT),我可以使用它来获取他们的用户详细信息,然后将其存储在本地存储中'-您使用哪些用户详细信息?你从哪里得到它们?
  • @OhadR 现在,后端存储他们的用户名、密码、createdAt,然后他们的帐户与其他表有各种关系,例如用户有 X 个帖子。
  • @OhadR 如果我不将它们存储在数据库中,我将如何使用这些关系?他们没有用户ID,因此不能有帖子,因为每个帖子都需要一个用户ID FK。 (我想在不大量更改代码结构的情况下添加 OAuth。)

标签: database authentication oauth github-oauth


【解决方案1】:

oAuth通常用于授权。这意味着,您从授权服务器获得访问令牌,资源服务器对其进行验证并让用户访问数据。

在您的情况下,您“并不真正需要”访问令牌 - 您只想将 oAuth 用于身份验证。 Web 应用程序(如 StackOverflow)这样做是为了“省去处理身份验证流程的麻烦”。意思是,如果我编写一个安全的应用程序,我需要以某种方式实现创建帐户流程、登录流程、忘记密码等。当您使用 3rd-party 身份验证时,您可以省去这个麻烦。

但是,您的应用程序确实需要一些用户 ID 来执行操作;因此,当用户第一次出现时,您必须在您的应用程序中创建一个用户 ID。从那时起,您无需担心密码过期、忘记密码甚至无法登录。当用户登录时,您将获得访问令牌,您需要做的就是从中获取您应用的用户 ID。

因此,我看不出您需要存储“密码”或访问令牌的原因。

希望这是有道理的。

【讨论】:

  • 谢谢,这就是我要找的。所以我基本上想通过实现 GitHub 登录来做与 StackOverflow 相同的事情。就像你说的,我的应用程序需要一个用户 ID 来执行操作。目前,我通过将电子邮件/密码添加到我的数据库并使用 PK 作为 ID 来获取此用户 ID。如果我不能将任何内容作为密码输入,我将如何为 GitHub 登录创建用户 ID?我是否必须为 GitHubUsers 创建一个单独的表,仅存储他们的 GitHub 用户名和 ID?
  • 首先 - 随时接受或支持对您有帮助的答案。其次,问题应该是-为什么要通过电子邮件和密码创建usedId?为什么需要密码?
  • 我需要电子邮件和密码,因为这就是我目前让用户创建帐户的方式。我想将 GitHub 添加为额外的注册/登录方法,听起来我现在的选择是删除我的登录名,仅使用 GitHub 并仅存储 GitHub 用户名。
  • 我了解您的用例。我认为您可以(并且应该)支持这两种方法,否则没有 GitHub 帐户的用户将没有资格使用您的应用程序。 (你想要吗?)。我建议只使用电子邮件作为用户 ID,而不使用密码。我认为它足够独特。想一想 - 您是否希望接受 2 个使用相同电子邮件但密码不同的用户? (我认为不是)
【解决方案2】:

您正在寻找的实际上是 OpenID Connect - 它是一个构建在 OAuth 之上的身份验证框架,可让您使用外部身份提供程序(如 Github)登录用户。

当用户使用 GitHub 登录时,您将收到一个签名 JWT 形式的 id_token。您可以轻松验证 JWT 的真实性 - 因此您可以轻松确保 id 令牌确实来自 Github 并呈现真实数据。通常 id 令牌中的信息之一将是用户的电子邮件。您可以使用它在数据库中查找用户。在这种情况下,您不需要任何密码。

因此,您将有两种方法在数据库中查找用户 - 通过比较电子邮件和密码,或者通过从 Github 验证的 id 令牌查找用户的电子邮件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-10
    • 1970-01-01
    • 2020-09-19
    相关资源
    最近更新 更多