使用 Google ID 令牌对用户进行身份验证

本页介绍如何在 API Gateway 中支持用户身份验证。

要对用户进行身份验证,客户端应用程序必须将 HTTP 请求的授权标头中的 JSON Web 令牌(JWT)发送到您的后端 API。API Gateway ��表 API 验证令牌,因此您无需在 API 中添加任何代码即可处理身份验证。但是,您需要为网关配置 API 配置来支持您选择的身份验证方法。

API Gateway 使用 JWT 颁发者的 JSON Web 密钥集 (JWKS) 高效地验证 JWT。JWKS 的位置在网关 API 配置中指定。API Gateway 会缓存 JWKS 五分钟,并且每五分钟刷新一次。

准备工作

  • 当客户端应用发送 HTTP 请求时,请求中的授权标头必须包含以下 JWT 声明:
    • iss(颁发者)
    • sub(主题)
    • aud(受众群体)
    • iat(颁发时间)
    • exp(到期时间)

配置 API Gateway 以支持客户端身份验证

API 配置中必须有安全部分,API Gateway 才能验证签名的 JWT 中的声明。用于定义安全方法的架构取决于您使用的 OpenAPI 规范版本。

要支持使用 Google ID 令牌的身份验证,请执行以下操作:

OpenAPI 2.0

  1. 将以下内容添加到您的 API 配置中:
    securityDefinitions:
      google_id_token:
        authorizationUrl: ""
        flow: "implicit"
        type: "oauth2"
        x-google-issuer: "https://accounts.google.com"
        x-google-jwks_uri: "https://www.googleapis.com/oauth2/v3/certs"
        # Optional. Replace CLIENT_ID with your client ID
        x-google-audiences: "CLIENT_ID"
  2. 在 API 级别添加安全性部分以应用于整个 API,或在方法级别应用以应用于特定方法。
    security:
       -   google_id_token: []

OpenAPI 3.x

  1. 将以下内容添加到您的 API 配置中:
    components:
      securitySchemes:
        google_id_token:
          type: oauth2
          flows:
           implicit:
             authorizationUrl: ""
             scopes: {}
          x-google-auth:
            issuer: https://accounts.google.com
            jwksUri: https://www.googleapis.com/oauth2/v3/certs
            # Optional. Replace CLIENT_ID with your client ID(s) as a list of strings.
            audiences:
              - CLIENT_ID
  2. 在 API 级别添加安全性部分以应用于整个 API,或在方法级别应用以应用于特定方法。
    security:
      - google_id_token: []

您可以在 API 配置中定义多个安全性定义,但每个定义都必须有不同的颁发者。如果同时在 API 级层和方法级层使用 security 部分,则方法级层的设置将覆盖 API 级层的设置。

x-google-audiences 字段 (OpenAPI 2.0) 或 audiences 字段 (OpenAPI 3.x) 不是必需字段。API Gateway 接受在 aud 声明中采用 https://SERVICE_NAME 格式的后端服务名称的所有 JWT。

如需允许其他客户端 ID 访问后端服务,您可以在适用的 audiences 字段中指定允许的客户端 ID。在 OpenAPI 2.0 中,多个受众群体以英文逗号分隔的值的形式指定;在 OpenAPI 3.x 中,多个受众群体以列表的形式指定。然后,API Gateway 会在 aud 声明中接受具有任何指定客户端 ID 的 JWT。

向 API Gateway API 发出经过身份验证的调用

使用身份验证令牌发送请求时,我们建议您将令牌放在 Authorization:Bearer 标头中。例如:

curl -H "Authorization: Bearer TOKEN" "GATEWAY_URL/hello"

其中,GATEWAY_URL 和 TOKEN 应分别替换为已部署网关网址和身份验证令牌。请参阅向 API Gateway API 发出经过身份验证的请求,查看使用 Authorization:Bearer 标头发送请求的示例代码。

如果在发送请求时无法使用标头,可以将身份验证令牌放在名为 access_token 的查询参数中。例如:

curl "GATEWAY_URL/hello?access_token=TOKEN"

在 API 中接收经过验证的结果

API Gateway 通常会转发它收到的所有标头。但是,当后端地址由 API 配置中的 x-google-backend 指定时,它会替换原来的 Authorization 标头。

API Gateway 会将 X-Apigateway-Api-Userinfo 中的身份验证结果发送到后端 API。我们建议您使用此标头,而不是原来的 Authorization 标头。此标头采用 base64url 编码,并且包含 JWT 载荷。

后续步骤