Oauth JWT(Json Web令牌)受众“;澳元;与客户Id-什么';有什么区别?

Oauth JWT(Json Web令牌)受众“;澳元;与客户Id-什么';有什么区别?,oauth,oauth-2.0,jwt,Oauth,Oauth 2.0,Jwt,我正在我的身份验证服务器中实现OAuth 2.0 JWT access_令牌。但是,我不清楚JWTaud声明和client\u idHTTP头值之间的区别。它们是一样的吗?如果没有,你能解释一下两者的区别吗 我怀疑,aud应该指的是资源服务器,client\u id应该指的是身份验证服务器识别的一个客户端应用程序(即web应用程序或iOS应用程序) 在我当前的例子中,我的资源服务器也是我的web应用程序客户端 事实证明,我的怀疑是对的。JWT中的受众aud声明是指应该接受令牌的资源服务器 正如《

我正在我的身份验证服务器中实现OAuth 2.0 JWT access_令牌。但是,我不清楚JWT
aud
声明和
client\u id
HTTP头值之间的区别。它们是一样的吗?如果没有,你能解释一下两者的区别吗

我怀疑,
aud
应该指的是资源服务器,
client\u id
应该指的是身份验证服务器识别的一个客户端应用程序(即web应用程序或iOS应用程序)


在我当前的例子中,我的资源服务器也是我的web应用程序客户端

事实证明,我的怀疑是对的。JWT中的受众
aud
声明是指应该接受令牌的资源服务器

正如《华盛顿邮报》所说:

令牌的受众是令牌的预期接收者

访问群体值是一个字符串——通常是 正在访问的资源,例如
https://contoso.com

OAuth中的
client\u id
指的是将从资源服务器请求资源的客户端应用程序

客户端应用程序(例如,您的iOS应用程序)将从您的身份验证服务器请求JWT。这样做时,它会传递它的
client\u id
client\u secret
以及可能需要的任何用户凭据。授权服务器使用
client\u id
client\u secret
验证客户端,并返回JWT

JWT将包含一个
aud
声明,该声明指定JWT对哪些资源服务器有效。如果
aud
包含
www.myfunwebapp.com
,但客户端应用尝试在
www.supersecretwebapp.com
上使用JWT,则访问将被拒绝,因为资源服务器将看到JWT不是为它准备的

JWT
aud
(观众)索赔 根据:

“aud”(受众)声明标识了JWT所属的接收者 为……准备的。拟处理JWT的每个委托人必须 让自己认同受众声明中的价值。如果委托人 处理声明时,不会使用 “aud”索赔如果存在该索赔,则JWT必须 拒绝。在一般情况下,“aud”值是大小写数组- 敏感字符串,每个字符串都包含StringOrURI值。在 特殊情况下,当JWT有一个受众时,“aud”值可能是 包含StringOrURI值的单个区分大小写的字符串最新版本 受众价值观的解释通常是特定于应用的。 此声明的使用是可选的

规范定义的受众(
aud
)声明是通用的,并且是特定于应用程序的。预期用途是识别令牌的预期接收者。收件人的意思是特定于应用程序的。受众值可以是字符串列表,也可以是单个字符串(如果只有一个
aud
声明)。令牌的创建者不强制要求正确验证
aud
,接收方负责确定是否应使用令牌

无论值是什么,当接收者验证JWT并且希望验证令牌是否用于其目的时,必须确定
aud
中的值标识自身,并且只有在
aud
声明中存在接收者声明的ID时,令牌才应进行验证。这是URL还是其他特定于应用程序的字符串并不重要。例如,如果我的系统决定在
aud
中使用以下字符串标识自己:
api3.app.com
,则只有当
aud
声明的受众值列表中包含
api3.app.com
时,它才应该接受JWT

当然,收件人可能会选择忽略
aud
,因此这仅在收件人希望确认令牌是专门为其创建的情况下才有用

根据规范,我的解释是,
aud
声明对于创建仅在特定目的下有效的特制JWT非常有用。对于一个系统,这可能意味着您希望令牌对某些功能有效,但对其他功能无效。您可以在仍然使用相同的密钥和验证算法的情况下,发行仅限于特定“受众”的令牌

由于在典型情况下,JWT由可信服务生成,并由其他可信系统(不希望使用无效令牌的系统)使用,因此这些系统只需协调它们将使用的值

当然,
aud
是完全可选的,如果您的用例不保证,可以忽略它。如果您不想将令牌限制为特定受众使用,或者您的任何系统实际上都不会验证
aud
令牌,那么它是无用的

示例:访问与刷新令牌 我能想到的一个人为(但简单)的例子是,我们可能希望使用JWTs访问和刷新令牌,而不必实现单独的加密密钥和算法,但只是希望确保访问令牌不会验证为刷新令牌,反之亦然

通过使用
aud
,我们可以为刷新令牌指定
refresh
声明,并在创建这些令牌时为访问令牌指定
access
声明。当请求从刷新令牌获取新的访问令牌时,我们需要验证刷新令牌是否是真正的刷新令牌。如上所述的
aud
验证将通过在
aud
中专门查找
refresh
声明,告诉我们该令牌是否实际上是有效的刷新令牌

OAuth客户端ID与JWT
aud
索赔 OAuth客户端ID完全不相关,并且没有