我应该如何将 OAuth 与我自己的身份验证系统一起存储?
How should I store OAuth with my own authentication system?
我有一个现有的 signup/login 系统:用户输入电子邮件和密码。密码经过哈希处理。我将它存储在数据库中。
当用户登录时,他们填写了他们的电子邮件和密码。密码经过哈希处理,我在数据库中查找电子邮件并检查电子邮件是否匹配。如果是,则他们已登录。
我想添加一个系统让用户使用第 3 方 OAuth 登录,例如 GitHub。我有那个设置,但我不确定要在我的数据库中存储什么数据。
我想我把他们的 GitHub 电子邮件作为电子邮件,然后使用他们 GitHub 的访问令牌作为密码(所以我会散列它并存储它。)
我认为这可行,但我担心访问令牌可能会改变,这意味着他们将被锁定在他们的帐户之外。
如果我不应该使用访问令牌作为密码,我应该使用什么?我需要将用户的电子邮件存储在我的数据库中,但目前需要密码,如果他们使用 GitHub 登录,我将无法获得密码。
(请注意,当用户登录时,我调用我的后端来生成一个访问令牌(JWT),我可以使用它来获取他们的用户详细信息,然后将其存储在本地存储中。我想然后能够用 GitHub 或其他任何东西做同样的事情。)
oAuth 通常 授权。意思是,您从授权服务器获取访问令牌,资源服务器验证它并让用户访问数据。
在您的情况下,您“并不真正需要”访问令牌 - 您只想使用 oAuth 进行 身份验证。 Web 应用程序(如 Whosebug)这样做是为了“省去”处理身份验证流程的麻烦。意思是,如果我编写一个安全应用程序,我需要以某种方式实现创建帐户流程、登录流程、忘记密码等。当您使用第 3 方身份验证时,您就省去了这个麻烦。
但是,您的应用程序确实需要一些用户 ID 来执行操作;因此,当用户第一次出现时,您必须在您的应用中创建一个用户 ID。从此,您再也不用担心密码过期、忘记密码,甚至连登录都不用担心了。当用户登录时,您将获得访问令牌,您需要做的就是从中获取您的应用程序的用户 ID。
因此,我看不出您需要存储 'password' 或访问令牌的原因。
希望这是有道理的。
您正在寻找的实际上是 OpenID Connect - 它是一个建立在 OAuth 之上的身份验证框架,它允许您使用外部身份提供商登录用户,例如 Github。
当用户使用 GitHub 登录时,您将收到一个 id_token 形式的签名 JWT。您可以轻松验证 JWT 的真实性 - 因此您可以轻松确保 id 令牌确实来自 Github 并呈现真实数据。通常 id 令牌中的信息之一是用户的电子邮件。您可以使用它来查找数据库中的用户。在这种情况下,您不需要任何密码。
因此,您将有两种方法在您的数据库中查找用户 - 通过比较电子邮件和密码,或者通过 Github.[=10] 中经过验证的 ID 令牌查找用户的电子邮件=]
我有一个现有的 signup/login 系统:用户输入电子邮件和密码。密码经过哈希处理。我将它存储在数据库中。
当用户登录时,他们填写了他们的电子邮件和密码。密码经过哈希处理,我在数据库中查找电子邮件并检查电子邮件是否匹配。如果是,则他们已登录。
我想添加一个系统让用户使用第 3 方 OAuth 登录,例如 GitHub。我有那个设置,但我不确定要在我的数据库中存储什么数据。
我想我把他们的 GitHub 电子邮件作为电子邮件,然后使用他们 GitHub 的访问令牌作为密码(所以我会散列它并存储它。)
我认为这可行,但我担心访问令牌可能会改变,这意味着他们将被锁定在他们的帐户之外。
如果我不应该使用访问令牌作为密码,我应该使用什么?我需要将用户的电子邮件存储在我的数据库中,但目前需要密码,如果他们使用 GitHub 登录,我将无法获得密码。
(请注意,当用户登录时,我调用我的后端来生成一个访问令牌(JWT),我可以使用它来获取他们的用户详细信息,然后将其存储在本地存储中。我想然后能够用 GitHub 或其他任何东西做同样的事情。)
oAuth 通常 授权。意思是,您从授权服务器获取访问令牌,资源服务器验证它并让用户访问数据。
在您的情况下,您“并不真正需要”访问令牌 - 您只想使用 oAuth 进行 身份验证。 Web 应用程序(如 Whosebug)这样做是为了“省去”处理身份验证流程的麻烦。意思是,如果我编写一个安全应用程序,我需要以某种方式实现创建帐户流程、登录流程、忘记密码等。当您使用第 3 方身份验证时,您就省去了这个麻烦。
但是,您的应用程序确实需要一些用户 ID 来执行操作;因此,当用户第一次出现时,您必须在您的应用中创建一个用户 ID。从此,您再也不用担心密码过期、忘记密码,甚至连登录都不用担心了。当用户登录时,您将获得访问令牌,您需要做的就是从中获取您的应用程序的用户 ID。
因此,我看不出您需要存储 'password' 或访问令牌的原因。
希望这是有道理的。
您正在寻找的实际上是 OpenID Connect - 它是一个建立在 OAuth 之上的身份验证框架,它允许您使用外部身份提供商登录用户,例如 Github。
当用户使用 GitHub 登录时,您将收到一个 id_token 形式的签名 JWT。您可以轻松验证 JWT 的真实性 - 因此您可以轻松确保 id 令牌确实来自 Github 并呈现真实数据。通常 id 令牌中的信息之一是用户的电子邮件。您可以使用它来查找数据库中的用户。在这种情况下,您不需要任何密码。
因此,您将有两种方法在您的数据库中查找用户 - 通过比较电子邮件和密码,或者通过 Github.[=10] 中经过验证的 ID 令牌查找用户的电子邮件=]