使用 JWT 授权方控制对 HTTP API 的访问 - Amazon API Gateway
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

使用 JWT 授权方控制对 HTTP API 的访问

您可以使用 JSON Web 令牌 (JWT) 作为 OpenID Connect (OIDC)OAuth 2.0 框架的一部分来限制客户端对您的 API 的访问。

如果您为 API 的路由配置 JWT 授权方,API 网关将验证客户端通过 API 请求提交的 JWT。API 网关根据令牌中的令牌验证和(可选)作用域来允许或拒绝请求。如果为路由配置作用域,则令牌必须至少包含路由的作用域之一。

您可以为 API 的每个路由配置不同的授权方,也可以为多个路由使用同一个授权方。

注意

没有标准的机制可以将 JWT 访问令牌与其他类型的 JWT(如 OpenID Connect ID 令牌)区分开来。除非您需要 ID 令牌进行 API 授权,否则我们建议您将路由配置为需要授权范围。您还可以将 JWT 授权方配置为需要相应的颁发者或受众(身份提供商仅在颁发 JWT 访问令牌时才使用他们)。

授权 API 请求

API Gateway 使用以下常规工作流程向配置为使用 JWT 授权方的路由授权请求。

  1. 检查 identitySource 是否有令牌。identitySource 只能包含令牌或前缀为 Bearer 的令牌。

  2. 对令牌解码。

  3. 使用从发布者的 jwks_uri 中提取的公有密钥检查令牌的算法和签名。目前仅支持基于 RSA 的算法。

  4. 验证声明。API Gateway 评估以下令牌声明:

    • kid – 令牌必须具有与签署令牌的 jwks_uri 中键匹配的标头声明。

    • iss – 必须匹配为授权方配置的 issuer

    • aud – 必须匹配为授权方配置的其中一个 audience 条目。

    • exp – 必须在 UTC 中的当前时间之后。

    • nbf – 必须在 UTC 中的当前时间之前。

    • scopescp – 令牌必须至少包含路由的 authorizationScopes 中的一个作用域。

如果这些步骤中的任何一个步骤失败,API 网关都会拒绝 API 请求。

验证 JWT 后,API 网关将令牌中的声明传递给 API 路由的集成。后端资源(如 Lambda 函数)可以访问 $context.authorizer.claims 中的 JWT 声明。例如,如果 JWT 包含了身份声明 emailID,则它在 $context.authorizer.claims.emailID 中可用。

使用 AWS CLI 创建 JWT 授权方

在创建 JWT 授权方之前,必须向身份提供商注册客户端应用程序。您必须还创建了 HTTP API。有关创建 HTTP API 的示例,请参阅 创建 HTTP API

以下命令创建使用 Amazon Cognito 作为身份提供商的 JWT 授权方。

aws apigatewayv2 create-authorizer \ --name authorizer-name \ --api-id api-id \ --authorizer-type JWT \ --identity-source '$request.header.Authorization' \ --jwt-configuration Audience=audience,Issuer=https://cognito-idp.us-west-2.amazonaws.com/userPoolID

使用 AWS CLI 更新路由以使用 JWT 授权方

以下命令更新路由以使用 JWT 授权方。

aws apigatewayv2 update-route \ --api-id api-id \ --route-id route-id \ --authorization-type JWT \ --authorizer-id authorizer-id \ --authorization-scopes user.id user.email