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