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_idaudience_id 的数组,但是 感觉就像它只是意味着该令牌对audiences 都有效,这使我认为我应该添加一个名为client 的自定义声明,以明确声明此令牌是为特定客户端创建的。

我没有遇到在 OAuth 登录请求中同时包含 client_idaudience_id(s) 的任何在线实现,我也没有看到对 client in the spec 的保留声明。

我在这里遗漏了什么吗?

在 JWT 中明确声明不同的 client_idaudience_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 或多个受众的主要内容,如果未能解决你的问题,请参考以下文章

当客户端需要令牌以访问多个受众时如何创建 JWT?

每个资源服务器的 JWT 多个受众

如何修复“访问令牌来自错误的受众或资源。”尝试使用 MSAL 令牌访问 Azure 的 REST api 时

Web Api中的JSON Web令牌与承载令牌

了解 Web 身份验证上下文中的 JSON Web 令牌 (JWT)

了解 Web 身份验证上下文中的 JSON Web 令牌 (JWT)