JSON Web 令牌中的客户端 ID 或多个受众
Posted
技术标签:
【中文标题】JSON Web 令牌中的客户端 ID 或多个受众【英文标题】:Client ID or Multiple Audiences In JSON Web Token 【发布时间】:2015-11-07 22:22:46 【问题描述】:我在我的应用程序中使用 JWT 实现 OAuth 2.0,但无法决定将什么设置为我的 aud
声明。用户将通过我的身份验证服务器“登录”到我的客户端以访问我的 API(资源)服务器。我希望我的令牌仅对特定客户端和特定 API 有效。
从我的客户端登录时,我在请求中包含的不是client_id
,而是most implementations I've found,aud
设置为client_id
。我倾向于在我的登录请求中包含一个客户 audience_id
字段,然后将令牌中的 aud
设置为 client_id
和 audience_id
的数组,但是 感觉就像它只是意味着该令牌对audiences
都有效,这使我认为我应该添加一个名为client
的自定义声明,以明确声明此令牌是为特定客户端创建的。
我没有遇到在 OAuth 登录请求中同时包含 client_id
和 audience_id
(s) 的任何在线实现,我也没有看到对 client
in the spec 的保留声明。
我在这里遗漏了什么吗?
在 JWT 中明确声明不同的 client_id
和 audience_id
的最佳做法是什么?
【问题讨论】:
【参考方案1】:JWT 的受众是资源服务器,因为这是处理令牌的地方,即验证、检查和采取行动。来自 RFC 7519,https://www.rfc-editor.org/rfc/rfc7519#section-4.1.3:
“aud”(受众)声明标识了 JWT 的接收者 用于。打算处理 JWT 的每个主体都必须 用受众声明中的价值来识别自己。 [...] 受众价值的解释通常是特定于应用程序的。 [...]
所以最佳实践是aud
应该标识资源服务器。
客户端只是令牌的呈现者,最佳实践(即在 OpenID Connect 和一些新兴的 OAuth 2.0 扩展草案中)使用azp
(授权的呈现者)进行该声明。来自http://openid.net/specs/openid-connect-core-1_0.html#CodeIDToken:
azp
可选的。授权方 - ID 令牌所属的一方 发布。如果存在,它必须包含此 OAuth 2.0 客户端 ID 派对。仅当 ID Token 具有单个 受众价值,并且该受众不同于授权的受众 派对。 [...]
所以最佳实践是azp
标识客户端。
【讨论】:
然后在来自客户端的初始登录请求中包含audience_id
,指示他们请求访问哪些受众?
可以使用scope
概念(和请求参数)间接创建该关系;这比范围和资源服务器之间的一对一映射提供了更大的灵活性;一般来说,范围模拟访问权限:范围可以映射到资源服务器,但也可以映射到受资源服务器等保护的特定资源,或资源服务器的集合以上是关于JSON Web 令牌中的客户端 ID 或多个受众的主要内容,如果未能解决你的问题,请参考以下文章
如何修复“访问令牌来自错误的受众或资源。”尝试使用 MSAL 令牌访问 Azure 的 REST api 时