JWT aud(观众)声明
根据RFC 7519:
“aud”(受众)声明标识 JWT 的接收者
用于。打算处理 JWT 的每个主体都必须
用受众声明中的价值来识别自己。如果校长
处理索赔并不表明自己具有价值
当此声明存在时,“aud”声明,则 JWT 必须是
被拒绝。在一般情况下,“aud”值是一个 case-
敏感字符串,每个都包含一个 StringOrURI 值。在里面
当 JWT 有一个受众的特殊情况下,“aud”值可能是
包含 StringOrURI 值的单个区分大小写的字符串。 该
受众价值的解释通常是特定于应用程序的。
使用此声明是可选的。
规范定义的受众 (aud) 声明是通用的,并且是特定于应用程序的。预期用途是识别令牌的预期接收者。收件人的意思是特定于应用程序的。受众值可以是字符串列表,或者如果只有一个 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 验证将通过专门查找aud 中的refresh 声明来告诉我们令牌是否实际上是有效的刷新令牌。
OAuth 客户端 ID 与 JWT aud 声明
OAuth 客户端 ID 完全不相关,并且与 JWT aud 声明没有直接关系。从 OAuth 的角度来看,令牌是不透明的对象。
接受这些标记的应用程序负责解析和验证这些标记的含义。我认为在 JWT aud 声明中指定 OAuth 客户端 ID 没有多大价值。