JWT(Json Web Token)受众“aud”与Client_Id – 有什么区别?

我正在我的身份validation服务器上实现OAuth 2.0 JWT access_token。 但是,我并不清楚JWT“aud”声明和client_id http头值之间的区别。 他们是一样的吗? 如果不是,你能解释两者的区别吗?

我怀疑是“aud”是指资源服务器,而client_id是指authentication服务器认可的客户端应用程序之一(即web应用程序或IOS应用程序)。

在我目前的情况下,我的资源服务器也是我的Web应用程序客户端。

事实certificate,我的怀疑是正确的。 JWT中的受众“aud”声明是指应接受令牌的资源服务器。

正如这篇文章简单地说:

令牌的受众是令牌的预期收件人。

受众值是一个string – 通常是被访问资源的基地址,例如“ https://contoso.com ”。

OAuth中的client_id指的是将从资源服务器请求资源的客户端应用程序。

客户端应用程序(例如您的IOS应用程序)将从您的身份validation服务器请求一个JWT。 这样做时,它会传递client_id和client_secret以及可能需要的任何用户凭据。 授权服务器使用client_id和client_secretvalidation客户端,并返回一个JWT。

JWT将包含一个“审计”声明,指明JWT有效的资源服务器。 如果“aud”包含“www.myfunwebapp.com”,但客户端应用程序尝试使用“www.supersecretwebapp.com”上的JWT,则访问将被拒绝,因为该资源服务器将看到JWT不适用于它。

JWT aud (Audience)声明

根据RFC 7519 :

“审计”(听众)声明确定了JWT预期的收件人。 每个旨在处理智威汤逊的负责人必须明确自己在听众声称中的价值。 如果处理索赔的主体在索赔存在时没有在“审计”索赔中标明其价值,那么JWT务必被拒绝。 在一般情况下,“aud”值是一个区分大小写的string数组,每个string都包含一个StringOrURI值。 在JWT有一个观众的特殊情况下,“aud”值可能是一个包含StringOrURI值的区分大小写的string。 观众价值的解释通常是特定于应用程序的。 使用这个声明是可选的。

规范中定义的Audience( aud )声明是通用的,并且是特定于应用程序的。 预期用途是识别令牌的预期收件人。 接收方的意思是应用程序特定的。 受众值是一个string列表,或者如果只有一个aud声明,它可以是单个string。 令牌的创build者并不强制authentication过程正确,责任是接收者确定是否应该使用令牌。

无论价值是什么,当收件人validationJWT,并且希望validation令牌是为了达到目的而使用时,它必须确定在aud什么值标识自己,并且令牌只应validation接收者的声明ID出现在aud声明中。 不要紧,如果这是一个URL或其他应用程序特定的string。 例如,如果我的系统决定使用stringapi3.app.comaud标识自己,那么只要aud声明在其受众值列表中包含api3.app.com ,就应该只接受JWT。

当然,收件人可能会select忽视aud ,所以这只有在收件人希望正确validation令牌是专门为其创build的情况下才有用。

基于规范的我的解释是, aud声明对于创build仅针对特定目的有效的专用JWT是有用的。 对于一个系统来说,这可能意味着你想要令牌对某些function有效,但对其他function无效。 您可以发出仅限于某个“受众”的令牌,同时仍使用相同的密钥和validationalgorithm。

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

当然, aud是完全可选的,如果你的用例不能保证, aud可以忽略。 如果您不想限制令牌被特定的受众使用,或者您的系统中没有一个会真正validationaud令牌,那么它就没用了。

示例:访问与刷新令牌

我能想到的一个有意思的(但简单的)例子可能是我们想要使用JWT来访问和刷新令牌,而不必实现单独的encryption密钥和algorithm,而只是想确保访问令牌不会被validation为刷新令牌, -versa。

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

OAuth客户端ID与JWT aud索赔

OAuth客户端ID完全不相关,并且与JWT aud权利要求没有直接关系。 从OAuth的angular度来看,令牌是不透明的对象。

接受这些令牌的应用程序负责parsing和validation这些令牌的含义。 在JWT aud声明中指定OAuth客户端ID时,我看不出太多价值。