12.2. APIcast 如何处理 JSON Web 令牌

APIcast 通过检查 JSON Web 令牌(JWT)来处理每个请求,该请求在对 API 消费者应用进行身份验证时返回了 OpenID Connect 身份提供程序。该请求包含由集成的 OpenID Connect 身份提供程序发布的格式的 JWT。JWT 必须位于 Authorization 标头中,它必须使用 Bearer 模式。例如,标头应类似如下:

Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJodHRwczovL2lkcC5leGFtcGxlLmNvbSIsInN1YiI6ImFiYzEyMyIsIm5iZiI6MTUzNzg5MjQ5NCwiZXhwIjoxNTM3ODk2MDk0LCJpYXQiOjE1Mzc4OTI0OTQsImp0aSI6ImlkMTIzNDU2IiwidHlwIjoiQmVhcmVyIn0.LM2PSmQ0k8mR7eDS_Z8iRdGta-Ea-pJRrf4C6bAiKz-Nzhxpm7fF7oV3BOipFmimwkQ_-mw3kN--oOc3vU1RE4FTCQGbzO1SAWHOZqG5ZUx5ugaASY-hUHIohy6PC7dQl0e2NlAeqqg4MuZtEwrpESJW-VnGdljrAS0HsXzd6nENM0Z_ofo4ZdTKvIKsk2KrdyVBOcjgVjYongtppR0cw30FwnpqfeCkuATeINN5OKHXOibRA24pQyIF1s81nnmxLnjnVbu24SFE34aMGRXYzs4icMI8sK65eKxbvwV3PIG3mM0C4ilZPO26doP0YrLfVwFcqEirmENUAcHXz7NuvA

有很多开源工具可安全解码 JWT。请注意,您不会在公共 Web 工具中解码 JWT。在解码的 JWT 中,您可以看到令牌有三个部分:

  • 标头提供有关如何对令牌进行格式的信息,以及用于为令牌签名的算法的信息。
  • 有效负载标识发送请求的 API 使用者。详情可包含此 API 使用者可以执行的读取和写入操作、API 消费者的电子邮件地址以及有关 API 消费者的其他信息。
  • 签名是一个加密签名,表示令牌没有被更改。

APIcast 检查 JWT 是否有以下特征:

  • 完整性 :JWT 是否被恶意用户更改?签名是否有效?

    JWT 包含了一个签名,令牌接收器可以验证该令牌,以确保已知签发者签名。此验证还可保证其内容仍然尽可能创建。3scale 支持基于公钥/私钥对的 RSA 签名。签发者使用私钥对 JWT 进行签名。APIcast 使用公钥验证令牌。APIcast 使用 OpenID Connect Discovery 获取可用于验证 JWT 签名的 JSON Web Keys(JWK)。

  • 时间 :当令牌可以接受处理时,当前的时间是多久?JWT 是否已过期?换句话说,APIcast 会检查 JWT nbf (而非时间之前)和过期(过期时间)声明。
  • 签发者 :已知为 APIcast 的 OpenID Connect 身份提供程序发布的 JWT 吗?换句话说,APIcast 验证 JWT 中指定的签发者是与 OpenID Connect Issuer 字段中配置的 API 供应商相同的签发者。签发者规格是集成 3scale 和 OpenID Connect 身份提供程序的步骤的一部分。这是 JWT 是声明
  • 客户端 ID :令牌是否包含 3scale 客户端应用程序 ID,它对于 APIcast 已知?此客户端 ID 必须与在流程中指定的 API 供应商与 OpenID Connect 身份提供程序集成的步骤中的 ClientID Token Claim 匹配。这是 JWT azp (授权方)声明和 aud (audience)声明。

如果有任何 JWT 验证或授权检查失败,APIcast 会返回 Authentication 失败的错误。否则,APIcast 将请求发送到 3scale 上游 API 后端。Authorization 标头保留在请求中,因此 API 后端也可以使用 JWT 检查用户和客户端身份。