如何为 OAuth2 访问令牌指定受众?
Posted
技术标签:
【中文标题】如何为 OAuth2 访问令牌指定受众?【英文标题】:How to specify audience for an OAuth2 access token? 【发布时间】:2018-02-03 05:48:24 【问题描述】:我很困惑,在向授权服务器发送授权请求时,似乎没有标准方法来指定访问令牌的受众。
OAuth2 将访问令牌指定为不透明字符串;规范中只提到了一次“受众”,表示访问令牌可能是“受众限制的”。 许多最近的授权服务器实现似乎都产生了 JWT 访问令牌,并且 JWT 指定了受众 (aud) 声明。
据我所知: - Auth0 使用“观众”参数 - Connect2id 使用“资源”参数 - Identity Server 对“aud”声明使用基于发行者的固定值,并假设范围足够 - 但是,这并不适合所有用例。 - 优秀的“OAuth2 in Action”一书在“aud”声明中展示了一个资源服务器 URI 的示例,但没有说明它来自哪里。
那么,如何以标准方式获取特定受众(资源服务器、API...)的访问令牌?
【问题讨论】:
您是正确的,因为 Auth0 选择实施他们的解决方案,使得audience
是与 auth/authz 请求一起发送的参数。您还可以将请求的scope
属性也添加到scope
参数中 - 例如。 scope: read:books
- 它没有遵守严格的标准,因为规范不存在。 Auth0 具有 API(资源 API)的概念,其中标识符是客户端可以用作受众值的受众,您可以在该资源 API 上设置特定范围。
@Free-Willaert 你是怎么解决这个问题的?您是否在授权请求中使用“受众”来识别资源服务器?
【参考方案1】:
我认为你是对的。有几个可用的指南。 The OAuth 2.0 Authorization Framework: Bearer Token Usage OAuth 2.0: Audience Information (draft-tschofenig-oauth-audience-00.txt)
OpenID connect明确定义“aud”参数为:
必填。此 ID 令牌的目标受众。它必须 包含依赖方的 OAuth 2.0 client_id 作为受众 价值。它还可以包含其他受众的标识符。在里面 一般情况下,aud 值是一个区分大小写的字符串数组。在 有一个观众时的常见特殊情况,aud 值 MAY 是一个区分大小写的字符串。
【讨论】:
感谢您的回复。请注意,虽然(已废弃?)Tschofenig 草案规范谈到了令牌请求中的受众参数,而不是授权请求中的参数; OpenID Connect 规范中提到的“aud”也是关于响应中的声明,而不是参数。【参考方案2】:您在对已接受答案的评论中提到了 Tschofeniq 草案,但实际上看起来该文档实际上确实支持using the audience
field:
观众 URI 必须是 [3] 的第 4.3 节定义的绝对 URI。它可能包含一个“application/x-www-form-urlencoded”格式的查询组件
事实上,这一步很重要,应该以这种方式完成:
步骤 (2):当客户端与令牌端点交互以获取访问令牌时,它必须填充新定义的
audience
参数...
所以看来 Auth0 的方向可能是正确的。正如您在评论中指出的那样,aud
字段用于响应,而不是请求(NodeJs 中的 jsonwebtoken 等常见库设置了这样的字段(以及sub
、jti
和 iss
) 解码 JWT 时。
【讨论】:
【参考方案3】:为特定受众/API/资源服务器请求访问令牌的“提议标准”方式是使用授权请求上的resource
查询参数。
在授权请求中使用“resource”参数时 授权端点,它指示身份 正在请求访问的受保护资源。
resource
指示正在访问的目标服务或资源 请求。它的值必须是绝对 URI
RFC8707:OAuth 2.0 的资源指标 https://datatracker.ietf.org/doc/html/rfc8707#section-2
【讨论】:
以上是关于如何为 OAuth2 访问令牌指定受众?的主要内容,如果未能解决你的问题,请参考以下文章