Oauth2 代码流中用于资源所有者身份验证的用户凭据存储在哪里?

问题描述 投票:0回答:0

我正在为 OAuth2 code flow 创建一个演示,我正在其中实现客户端、资源服务器和身份验证服务器。在我见过的所有实现中,在让资源所有者批准客户端授权请求之前,资源所有者必须先登录认证服务器。这是认证服务器知道谁请求访问资源服务器中受保护资源所必需的。

我意识到这部分与 OAuth2 或 OpenID Connect 协议无关。 OAuth2 描述了资源所有者如何授权第三方客户端访问他/她自己的数据,但身份验证服务器登录是特定于实现的(甚至可能以无密码的方式发生)。 OpenID Connect 是 OAuth2 的扩展,但专注于为客户端提供必要的身份验证信息。


所以,在 OAuth2 上下文中,我想到了两种可能的基于用户凭据的身份验证服务器登录实现:

  • 身份验证服务器可以访问包含类型行的数据存储

    id, username, hashed_password

    当资源所有者登录时,身份验证服务器可以使用上述数据存储来验证凭据。这种方法的问题是我必须维护此数据存储中的每个用户与资源服务器存储中的相应用户之间的映射。

  • 与某个用户相关的数据(包括用户名和哈希密码)独占保存在资源服务器中。这意味着身份验证服务器必须查询资源服务器以验证资源所有者在登录期间提交的用户凭据。除了额外 RTT 的成本外,将身份验证信息放在资源服务器中似乎不适合我。毕竟,用户和密码绑定到一个非功能需求(安全)。我是否错误地考虑了资源服务器的用途?

这些做法合理吗?哪个更适合 OAuth2 模型?最流行的 OAuth2 服务通常如何处理?


编辑:ChatGPT 答案

在等待答案的过程中,我采访了ChatGPT,它同意我认为第二种方法是不正确的。这是它的解释:

资源服务器不应在 OAuth 2.0 协议的上下文中存储用户的密码。在标准的 OAuth 2.0 流程中,资源所有者(用户)的身份验证由身份验证服务器处理。身份验证服务器负责验证用户的凭据,例如用户名和密码,并代表用户向客户端(应用程序)颁发访问令牌。

资源服务器必须能够将访问令牌与其托管的用户数据相关联。通常,身份验证服务器在访问令牌负载中包含一些用户信息(例如用户 ID 或电子邮件地址),资源服务器可以使用这些信息来识别用户并检索任何必要的数据。 另一方面,资源服务器应该只接收和验证客户端提供的访问令牌,以确定客户端是否被授权访问所请求的资源。资源服务器不需要知道用户的密码,因为它自己不执行身份验证。

身份验证服务器可以存储用户的电子邮件和密码(以安全散列和加盐的形式)并将其与唯一的用户 ID 相关联。然后可以使用此用户 ID 将存储在资源服务器上的用户数据与身份验证服务器颁发的访问令牌相关联。


显然,非常欢迎一个更完整(和可靠)的答案,也许包括来源。

authentication oauth-2.0 credentials
© www.soinside.com 2019 - 2024. All rights reserved.