Answers:
事实证明,我的猜想是对的。aud
JWT中的观众声明是指应接受令牌的资源服务器。
正如这篇文章简单地说的那样:
令牌的受众是令牌的预期接收者。
受众群体值是一个字符串-通常是所访问资源的基地址,例如
https://contoso.com
。
该client_id
在的OAuth是指将来自资源服务器将请求资源的客户端应用程序。
客户端应用程序(例如您的iOS应用程序)将向您的身份验证服务器请求JWT。这样,它会传递它client_id
以及client_secret
可能需要的所有用户凭据。授权服务器使用client_id
和验证客户端,client_secret
并返回JWT。
JWT将包含一个aud
声明,该声明指定JWT适用于哪些资源服务器。如果aud
包含www.myfunwebapp.com
,但客户端应用程序尝试在上使用JWT www.supersecretwebapp.com
,则访问将被拒绝,因为该资源服务器将看到JWT并不适合它。
aud
(受众群体)索赔根据RFC 7519:
“听众”(观众)声明标识了JWT的目标收件人。每个打算处理JWT的负责人必须在受众声明中标识自己的价值。如果存在该声明时,处理该声明的委托人未使用“ aud”声明中的值标识自身,则必须拒绝JWT。通常,“ aud”值是区分大小写的字符串数组,每个字符串都包含StringOrURI值。在特殊情况下,当JWT有一个听众时,“ aud”值可以是一个包含StringOrURI值的区分大小写的字符串。 受众价值的解释通常是特定于应用程序的。 使用此声明是可选的。
aud
规范定义的Audience()声明是通用的,并且是针对特定应用的。预期用途是识别令牌的预期接收者。收件人的意思是特定于应用程序的。受众群体值可以是字符串列表,或者,如果只有一个aud
声明,则可以是单个字符串。令牌的创建者不会强制执行aud
经过正确验证的令牌,由接收者负责确定是否应使用令牌。
无论该值是什么,当接收方正在验证JWT并希望验证令牌是否打算用于其目的时,它都必须确定aud
自身的值,并且令牌仅应在接收方声明的ID为存在于aud
索赔中。这是URL还是其他特定于应用程序的字符串都没有关系。例如,如果我的系统决定aud
使用字符串标识自己:api3.app.com
那么,仅当aud
声明包含api3.app.com
在受众群体值列表中时,它才应接受JWT 。
当然,接收者可能会选择忽略aud
,因此仅当接收者想要肯定地验证令牌是专门为其创建的时,这才有用。
我基于该规范的解释是,该aud
声明对于创建仅对某些特定目的有效的专用JWT有用。对于一个系统,这可能意味着您希望令牌对某些功能有效,但对其他功能无效。您可以发行仅限于某个“受众”的令牌,同时仍使用相同的密钥和验证算法。
由于在典型情况下,JWT由受信任的服务生成,并由其他受信任的系统(不想使用无效令牌的系统)使用,因此这些系统仅需要协调它们将使用的值。
当然,它aud
是完全可选的,如果您的用例不保证它可以忽略。如果您不想将令牌限制为仅由特定的受众使用,或者您的系统实际上都不会验证aud
令牌,则它是无用的。
我可以想到的一个人为(但很简单)的示例可能是我们想使用JWT来访问和刷新令牌,而不必实现单独的加密密钥和算法,而只是想确保访问令牌不会作为刷新令牌而有效,否则-反之亦然。
通过使用,aud
我们可以在创建这些令牌时指定refresh
刷新令牌的声明和access
访问令牌的声明。当请求从刷新令牌中获取新的访问令牌时,我们需要验证刷新令牌是真正的刷新令牌。如上所述的aud
验证将通过专门查找refresh
in 的声明来告诉我们该令牌是否实际上是有效的刷新令牌aud
。
aud
声明OAuth客户端ID完全不相关,并且与JWT aud
声明没有直接相关。从OAuth的角度来看,令牌是不透明的对象。
接受这些令牌的应用程序负责解析和验证这些令牌的含义。在JWT aud
声明中指定OAuth客户端ID时,我看不到太多价值。
我知道这是为oauth 2.0和NOT OIDC标记的,但是这两个标准之间经常存在混淆,因为这两个标准都可以使用JWT和aud
声明。一个(OIDC)本质上是另一个(OAUTH 2.0)的扩展。(我偶然发现了这个问题,亲自寻找OIDC。)
对于OAuth 2.0 访问令牌,现有的答案很好地覆盖了它。此外,这是OAuth 2.0框架(RFC 6749)中的一个相关部分
对于使用隐式流的公共客户端,此规范未提供任何方法供客户端确定向其颁发访问令牌的客户端。
...
向客户端验证资源所有者不在此规范范围内。任何使用授权过程作为对客户端的委派最终用户身份验证的形式的规范(例如,第三方登录服务)都必须在没有其他使客户端能够确定访问是否安全的附加安全机制的情况下使用隐式流程。发行了令牌以供使用(例如,受众限制访问令牌)。
OIDC 除访问令牌外还具有ID令牌。OIDC规范对aud
ID令牌中声明的使用是明确的。(openid-connect-core-1.0)
AUD
REQUIRED。该ID令牌的目标受众。它必须包含依赖方的OAuth 2.0 client_id作为受众值。它也可以包含其他受众的标识符。通常,aud值是区分大小写的字符串数组。在只有一个听众的特殊情况下,aud值可以是单个区分大小写的字符串。
此外,OIDC指定azp
与aud
何时aud
具有多个值一起使用的声明。
azp
可选。授权方-发行ID令牌的一方。如果存在,则必须包含该参与方的OAuth 2.0客户端ID。仅当ID令牌具有单个受众值并且该受众不同于授权方时,才需要此声明。即使授权方与唯一的听众相同,也可以包括在内。azp值是区分大小写的字符串,其中包含StringOrURI值。
尽管这很老,但我认为问题甚至在今天仍然有效
我的怀疑是aud应该引用资源服务器,而client_id应该引用身份验证服务器认可的客户端应用程序之一
是的,aud应指代代币使用方。而CLIENT_ID指令牌获取方。
在我当前的情况下,我的资源服务器也是我的Web应用程序客户端。
在OP的情况下,Web应用程序和资源服务器都属于同一方。因此,这意味着客户和受众相同。但是在某些情况下并非如此。
考虑使用消耗OAuth保护资源的SPA。在这种情况下,SPA是客户端。受保护的资源是访问令牌的受众。
第二种情况很有趣。有一个名为“ OAuth 2.0的资源指标 ”的工作草案,该草案解释了您可以在授权请求中定义目标受众的位置。因此,生成的令牌将仅限于指定的受众。此外,Azure OIDC使用类似的方法,该方法允许资源注册并允许auth请求包含资源参数,以定义访问令牌预期的访问者。这种机制允许OAuth分配在客户端和令牌消费(受众)方之间进行分隔。
aud REQUIRED for session_token. Contains the client_id of the client receiving the assertion.