12.2. APIcast 如何处理 JSON Web 令牌
APIcast 通过检查对 API 使用者应用返回的 OpenID Connect 身份提供程序,从而处理每个请求。该请求包含由集成的 OpenID Connect 身份提供程序发布的 JWT。JWT 必须位于 Authorization
标头中,且必须使用 Bearer
模式。例如,标头应类似如下:
Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJodHRwczovL2lkcC5leGFtcGxlLmNvbSIsInN1YiI6ImFiYzEyMyIsIm5iZiI6MTUzNzg5MjQ5NCwiZXhwIjoxNTM3ODk2MDk0LCJpYXQiOjE1Mzc4OTI0OTQsImp0aSI6ImlkMTIzNDU2IiwidHlwIjoiQmVhcmVyIn0.LM2PSmQ0k8mR7eDS_Z8iRdGta-Ea-pJRrf4C6bAiKz-Nzhxpm7fF7oV3BOipFmimwkQ_-mw3kN--oOc3vU1RE4FTCQGbzO1SAWHOZqG5ZUx5ugaASY-hUHIohy6PC7dQl0e2NlAeqqg4MuZtEwrpESJW-VnGdljrAS0HsXzd6nENM0Z_ofo4ZdTKvIKsk2KrdyVBOcjgVjYongtppR0cw30FwnpqfeCkuATeINN5OKHXOibRA24pQyIF1s81nnmxLnjnVbu24SFE34aMGRXYzs4icMI8sK65eKxbvwV3PIG3mM0C4ilZPO26doP0YrLfVwFcqEirmENUAcHXz7NuvA
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 :令牌是否包含已知 APIcast 的 3scale 客户端应用程序 ID?此客户端 ID 必须与将 3scale 与 OpenID Connect 身份提供程序集成过程中指定的 API 供应商匹配 ClientID Token Claim。这是 JWT 发布的 JWT 和
a
ud
如果任何 JWT 验证或授权检查失败,则 APIcast 会返回一个 身份验证失败
错误。否则,APIcast 将请求发送到 3scale 上游 API 后端。Authorization
标头保留在请求中,因此 API 后端也可以使用 JWT 检查用户和客户端身份。