aud
声明和client_id
HTTP头值之间的区别是什么。他们相同吗?如果不是,请解释一下两者之间的区别。我的猜测是,
aud
应该指向资源服务器,而client_id
应该指向身份验证服务器识别的客户端应用程序之一(即Web应用程序或iOS应用程序)。在我目前的情况下,我的资源服务器也是我的Web应用程序客户端。
aud
声明和client_id
HTTP头值之间的区别是什么。他们相同吗?如果不是,请解释一下两者之间的区别。aud
应该指向资源服务器,而client_id
应该指向身份验证服务器识别的客户端应用程序之一(即Web应用程序或iOS应用程序)。事实证明,我的怀疑是正确的。JWT中的aud声明是指应接受令牌的资源服务器。
正如这篇文章所述:
令牌的受众是令牌的预期接收者。
受众值是一个字符串--通常是正在访问的资源的基地址,例如
https://contoso.com
。
OAuth中的client_id
是指将请求来自资源服务器的资源的客户端应用程序。
客户端应用程序(例如您的iOS应用程序)将从身份验证服务器请求JWT。在此过程中,它传递了它的client_id
和client_secret
以及可能需要的任何用户凭据。授权服务器使用client_id
和client_secret
验证客户端并返回JWT。
JWT将包含一个aud
声明,指定JWT有效的资源服务器。如果aud
包含www.myfunwebapp.com
,但客户端应用程序试图在www.supersecretwebapp.com
上使用JWT,则将拒绝访问,因为该资源服务器将看到JWT不是为其而设计的。
aud
也可能是 client_id
。请参阅 https://tools.ietf.org/id/draft-hunt-oauth-v2-user-a4c-01.txt 中的说明:aud 在 session_token 中是必需的,包含接收断言的客户端的 client_id。
- themihai根据RFC 7519:
“aud”(受众)声明标识了JWT的接收方。每个要处理JWT的主体都必须在受众声明中使用一个值来识别自己。如果处理声明的主体在此声明存在时没有使用一个值来识别自己,则JWT必须被拒绝。通常情况下,“aud”值是包含StringOrURI值的大小写敏感字符串数组。当JWT只有一个受众时,“aud”值可以是包含StringOrURI值的单个大小写敏感字符串。 受众值的解释通常是应用程序特定的。 使用该声明是可选的。
规范定义的Audience(aud
)声明是通用的,并且是应用程序特定的。它的预期用途是标识令牌的预期接收者。接收者的含义是应用程序特定的。受众值可以是字符串列表,或如果只有一个aud
声明,则可以是单个字符串。创建令牌的人不强制执行对aud
的正确验证,确定是否应使用令牌的责任在于接收方。
我知道这标记为oauth 2.0而不是OIDC,但是经常会将两个标准混淆,因为两种标准都可以使用JWT和aud
声明。其中一个(OIDC)基本上是另一个(OAUTH 2.0)的扩展。(我自己也在寻找OIDC时偶然发现了这个问题。)
对于OAuth 2.0访问令牌,现有的答案已经很好地涵盖了它。此外,以下是OAuth 2.0 Framework (RFC 6749)中的一个相关部分:
对于使用隐式流的公共客户端,本规范没有提供任何方法让客户端确定访问令牌发放给哪个客户端。
...
将资源所有者身份验证到客户端超出了本规范的范围。任何使用授权过程作为委派用户身份验证到客户端的形式(例如,第三方登录服务)的规范,如果没有额外的安全机制来使客户端能够确定是否为其使用发放了访问令牌(例如,针对受众-限制访问令牌),则不能使用隐式流。
OIDC除了Access tokens之外还有ID Tokens。OIDC规范在ID Tokens中使用aud
声明时是明确的。(openid-connect-core-1.0)
aud
必选项。该ID Token的目标受众。 它必须包含Relying Party的OAuth 2.0客户端ID作为受众值。 它也可以包含其他受众的标识符。一般情况下,aud值是区分大小写的字符串数组。当只有一个受众时,aud值可以是单个区分大小写字符串。
此外,OIDC规定了在aud
具有多个值时与其一起使用的azp
声明。
azp
可选项。发出ID Token的授权方- 接收ID Token的一方。如果存在,则必须包含此方的OAuth 2.0客户端ID。仅当ID Token具有单个受众且该受众不同于授权方时才需要此声明。即使授权方与唯一受众相同,也可以包括它。azp值是包含StringOrURI值的区分大小写字符串。
虽然这篇文章是老的,但我认为问题即使今天仍然存在。
我怀疑 aud 应该指的是资源服务器,而 client_id 应该指的是身份验证服务器识别的客户端应用程序之一
是的,aud 应该指向使用令牌的一方。而 client_id 指的是获取令牌的一方。
在我的当前情况下,我的资源服务器也是我的 Web 应用程序客户端。
在原帖作者的情况下,Web 应用程序和资源服务器都属于同一个实体。这意味着客户端和受众是相同的。但也有可能出现这种情况不成立的情况。
想象一下一个基于 SPA 的 OAuth 受保护资源的场景。在这种情况下,SPA 是客户端。受保护的资源是访问令牌的受众。
这第二个场景很有趣。RFC8707 "OAuth 2.0 资源指示器" 解释了您可以在授权请求中使用 resource 参数定义预期受众的位置。因此,生成的令牌将受到限制,并只能用于指定的受众。Azure OIDC 采用了类似的方法,允许资源注册,并允许认证请求包含资源参数以定义访问令牌的预期受众。这种机制允许 OAuth 适应具有客户端和使用令牌(受众)方分离的实体。