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

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

要对用户进行身份验证,客户端应用程序必须将 HTTP 请求的授权标头中的 JSON Web 令牌(JWT)发送到您的后端 API。Extensible Service Proxy(ESP)代表您的 API 验证令牌,因此您无需在API中添加任何代码即可处理身份验证。不过,您需要配置 OpenAPI 文档以支持您选择的身份验证方法。

ESP 使用 JWT 颁发者的公钥高效地验证 JWT。ESP 缓存公钥 5 分钟。此外,ESP 会缓存经过验证的 JWT 五分钟或直到 JWT 到期,以先发生者为准。

准备工作

  • 向您的客户端应用添加身份验证代码,该代码允许用户通过使用 Google 账户登录进行身份验证。

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

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

OpenAPI 文档中必须包含安全要求对象安全性定义对象,ESP 才能验证签名的 JWT 中的声明。

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

  1. 将以下代码添加到 OpenAPI 文档中的安全性定义中:

      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 YOUR-CLIENT-ID with your client ID
          x-google-audiences: "YOUR-CLIENT-ID"
    
  2. 在 API 级别添加安全性部分以应用于整个 API,或在方法级别应用以应用于特定方法。

      security:
        - google_id_token: []
    

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

不需要 x-google-audiences 字段。ESP 在 aud 声明中接受所有 https://SERVICE_NAME 格式的后端服务名称的 JWT。要允许其他客户端 ID 访问后端服务,您可以使用以逗号分隔的值在 x-google-audiences 字段中指定允许的客户端 ID。然后,ESP 会在 aud 声明中接受任何具有指定客户端 ID 的 JWT。

您还可以通过添加 x-google-extensions 来自定义 JWT 位置。如需了解详情,请参阅 openAPI 扩展程序

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

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

curl -H "Authorization: Bearer ${TOKEN}" "${ENDPOINTS_HOST}/echo"

其中 ENDPOINTS_HOSTTOKEN 分别是包含 API 主机名和身份验证令牌的环境变量。请参阅向 Endpoints API 发出经过身份验证的请求。表示使用 Authorization:Bearer 标头发送请求的示例代码。

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

curl "${ENDPOINTS_HOST}/echo?access_token=${TOKEN}"

在 API 中接收身份验证结果

ESP 通常会转发收到的所有标头。但是,当后端地址由 OpenAPI 规范中的 x-google-backend 或 gRPC 服务配置中的 BackendRule 指定时,它会替换原来的 Authorization 标头。

ESP 会将 X-Endpoint-API-UserInfo 中的身份验证结果发送到后端 API。我们建议您使用此标头,而不是原来的 Authorization 标头。此标头是一个字符串。base64url对 JSON 对象进行编码。ESPv2 和 ESP 的 JSON 对象格式有所不同。对于 ESPv2,JSON 对象恰好是原始 JWT 载荷。对于 ESP,JSON 对象使用不同的字段名称,并将原始 JWT 载荷放在 claims 字段下。如需详细了解格式,请参阅处理后端服务中的 JWT

后续步骤