资源提供者应如何验证 OAuth2 令牌?

信息安全 验证 oauth 授权
2021-08-19 13:26:23

资源提供者通常提供对资源的读写访问。

因此,资源提供者不仅应该验证令牌(它是否过期?它是否被撤销?它是否有效?它是否包含所需的范围?),他们还应该检查令牌的权限(使用 XY 是否具有足够的读取或写入权限资源ZY?)。

到目前为止,我使用了以下工作流程:

  1. 客户端通过 OAuth2 代码授权接收访问令牌。
  2. 客户代表用户提出请求,例如 GET /user_postings
  3. 资源服务(我们称之为User Postings)通过向授权服务器发出请求来验证令牌,确认令牌有效。授权服务器还传递令牌过期日期、令牌受众、令牌范围和令牌主题(例如用户 XY)等元数据
  4. 资源服务现在验证主题(例如用户 XY)是否被授权/允许执行请求。例如,通过检查访问控制列表或类似内容。例如:假设用户 XY 想要更新用户 AB 发布的用户。例如,这将被访问控制列表禁止。
  5. 如果验证通过,资源服务器将执行请求。

这是一种有效的做事方式还是我打开了攻击媒介?资源服务器是否可以假定令牌的主题是被视为授权请求的主题?是否有解决此问题的最佳实践或标准?

我目前很困惑,因为我读到 OAuth2 仅是委托,而不是授权或身份验证,并且客户端不应做出隐含的假设,例如“令牌 XY 属于用户 AB,因此用户 AB 已通过身份验证”。

任何帮助都将不胜感激。

1个回答

RFC 6750OAuth 2.0 授权框架:不记名令牌使用第 5 节:安全注意事项讨论了与使用不记名令牌相关的一些问题。从第 5.2 节开始:

5.2. 威胁缓解

通过使用数字签名或消息验证码 (MAC) 来保护令牌的内容,可以缓解大范围的威胁。或者,不记名令牌可以包含对授权信息的引用,而不是直接对信息进行编码。攻击者必须无法猜测此类引用;使用引用可能需要服务器和令牌颁发者之间的额外交互来解析对授权信息的引用。本规范未定义这种交互的机制。

在工作流程的第 3 步中,您描述了询问授权服务令牌是否有效的资源服务。这是使用引用来解析授权信息的示例。但是,步骤 4 让资源服务器验证主题(例如 UserXY)。这是将授权编码到令牌本身的示例。这种混合方法不是问题,但您可以通过选择其中一种来简化您的设计。

此外,与其使用令牌主题 UserXY 将所有用户的授权传递给单个令牌,不如在这里使用最小权限原则并让授权服务器放置特定授权(例如,阅读 UserXY 电子邮件,撰写 UserXY 消息) 而不是访问 UserXY 可以做的任何事情。