[oauth] JWT(Json Web Token)观众“aud”与Client_Id - 有什么区别?



0 Answers

JWT aud (受众)索赔

根据RFC 7519

“aud”(观众)声明标识了JWT的目标收件人。 每个打算处理JWT的委托人都必须在受众索赔中标明自己的价值。 如果处理索赔的委托人在存在此索赔时未在“aud”索赔中标识其自身,则必须拒绝JWT。 在一般情况下,“aud”值是一个区分大小写的字符串数组,每个字符串包含一个StringOrURI值。 在JWT有一个受众的特殊情况下,“aud”值可以是包含StringOrURI值的单个区分大小写的字符串。 对受众价值的解释通常是针对具体应用的。 使用此声明是可选的。

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

无论价值是什么,当收件人验证JWT并且它希望验证令牌是否用于其目的时,它必须确定aud哪个值标识自己,并且令牌应仅验证收件人的声明ID是否在aud索赔中存在。 如果这是URL或其他特定于应用程序的字符串,则无关紧要。 例如,如果我的系统决定使用字符串: api3.app.comaud标识自己,那么如果aud声明在其受众值列表中包含api3.app.com ,则它应该只接受JWT。

当然,收件人可以选择忽略aud ,因此这仅在收件人希望肯定验证是否专门为其创建令牌时才有用。

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

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

当然, aud是完全可选的,如果您的用例不能保证,则可以忽略。 如果您不想限制令牌被特定受众使用,或者您的系统实际上都不会验证该令牌,那么它就没用了。

示例:访问与刷新令牌

我能想到的一个设计(但简单)的例子可能是我们想要使用JWT来访问和刷新令牌而不必实现单独的加密密钥和算法,而只是想确保访问令牌不会验证为刷新令牌,或者副本-versa。

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

OAuth客户端ID与JWT aud声明

OAuth客户端ID完全不相关,与JWT aud声明没有直接关联。 从OAuth的角度来看,令牌是不透明的对象。

接受这些令牌的应用程序负责解析和验证这些令牌的含义。 我认为在JWT aud声明中指定OAuth客户端ID没有多大价值。

Question

我正在我的身份验证服务器中实现OAuth 2.0 JWT access_token。 但是,我不清楚JWT“aud”声明与client_id http标头值之间的差异。 它们是一样的吗? 如果没有,你能解释两者之间的区别吗?

我怀疑“aud”应该引用资源服务器,而client_id应该引用认证服务器识别的客户端应用程序之一(即web应用程序或IOS应用程序)。

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




Related