4. Validating JWT Access Tokens (验证JWT访问令牌)
为了便于验证数据检索, 推荐 (RECOMMENDED) 授权服务器使用非对称算法对JWT访问令牌进行签名.
授权服务器应该 (SHOULD) 使用OAuth 2.0授权服务器元数据 (OAuth 2.0 Authorization Server Metadata) [RFC8414] 通过 "jwks_uri" 向资源服务器公布其签名密钥, 并通过 "issuer" 元数据值公布期望的 "iss" 声明值. 或者, 实现OpenID Connect的授权服务器可以 (MAY) 为同一目的使用OpenID Connect发现 (OpenID Connect Discovery) [OpenID.Discovery] 文档. 如果授权服务器同时支持OAuth 2.0授权服务器元数据和OpenID Connect发现, 则在两种发布方法中提供的值必须 (MUST) 一致.
授权服务器可以 (MAY) 选择使用不同的密钥来签署OpenID Connect ID Token和JWT访问令牌. 本规范不提供用于识别特定密钥作为用于签署JWT访问令牌的密钥的机制. 授权服务器可以使用通过授权服务器 (AS) 元数据或OpenID Connect发现公布的任何密钥来签署JWT访问令牌. 有关安全影响的进一步指导, 请参见第5节.
接收JWT访问令牌的资源服务器必须 (MUST) 按以下方式对其进行验证.
-
资源服务器必须 (MUST) 验证 "typ" 头部值是 "at+jwt" 或 "application/at+jwt", 并拒绝携带任何其他值的令牌.
-
如果JWT访问令牌已加密, 则使用资源服务器在注册期间指定的密钥和算法对其进行解密. 如果在注册时与授权服务器协商了加密, 而传入的JWT访问令牌未加密, 则资源服务器应该 (SHOULD) 拒绝它.
-
授权服务器的发行者标识符 (通常在发现期间获取) 必须 (MUST) 与 "iss" 声明的值完全匹配.
-
资源服务器必须 (MUST) 验证 "aud" 声明包含一个资源指示符值, 该值对应于资源服务器自己期望的标识符. 如果 "aud" 不包含当前资源服务器作为有效受众 (Audience) 的资源指示符, 则必须 (MUST) 拒绝该JWT访问令牌.
-
资源服务器必须 (MUST) 根据[RFC7515]使用JWT "alg" 头部参数中指定的算法验证所有传入JWT访问令牌的签名. 资源服务器必须 (MUST) 拒绝任何 "alg" 值为 "none" 的JWT. 资源服务器必须 (MUST) 使用授权服务器提供的密钥.
-
当前时间必须 (MUST) 在 "exp" 声明表示的时间之前. 实现者可以 (MAY) 提供一些小的余地, 通常不超过几分钟, 以考虑时钟偏差.
资源服务器必须 (MUST) 按照[RFC6750]第3.1节中的描述处理错误. 特别是, 在上述验证检查中的任何失败的情况下, 授权服务器响应必须 (MUST) 包含错误代码 "invalid_token". 请注意, 此要求不会阻止JWT访问令牌使用除 "Bearer" 之外的认证方案.
如果JWT访问令牌包含第2.2.3节中描述的授权声明, 资源服务器应该 (SHOULD) 将它们与任何其他可用的上下文信息结合使用, 以确定是否应授权或拒绝当前调用. 有关资源服务器如何执行这些检查的详细信息超出了本配置文件规范的范围.