使用 Firebase 对用户进行身份验证

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

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

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

准备工作

  • 向您的客户端应用、Firebase 身份验证、文档添加身份验证代码。Firebase 支持使用密码、电话号码以及 Google、Facebook 和 Twitter 等热门联合身份提供商进行身份验证。
    • 当客户端应用发送 HTTP 请求时,请求中的授权标头必须包含以下 JWT 声明:
      • iss(颁发者)
      • sub(主题)
      • aud(受众群体)
      • iat(颁发时间)
      • exp(到期时间)

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

API 配置中必须有安全要求对象安全性定义对象,API Gateway 才能验证签名的 JWT 中的声明。

要支持 Firebase 身份验证,请执行以下操作:

  1. 将以下内容添加到 API 配置中的安全性定义中:

     securityDefinitions:
        firebase:
          authorizationUrl: ""
          flow: "implicit"
          type: "oauth2"
          # Replace YOUR-PROJECT-ID with your project ID
          x-google-issuer: "https://securetoken.google.com/YOUR-PROJECT-ID"
          x-google-jwks_uri: "https://www.googleapis.com/service_accounts/v1/metadata/x509/securetoken@system.gserviceaccount.com"
          x-google-audiences: "YOUR-PROJECT-ID"
    
  2. 在 API 级别添加安全性部分以应用于整个 API,或在方法级别应用以应用于特定方法。

     security:
        - firebase: []
    

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

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

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

curl --request POST \
  --header "Authorization: Bearer ${TOKEN}" \
  "${GATEWAY_URL}/echo"

其中,GATEWAY_URLTOKEN 分别是包含已部署网关网址和身份验证令牌的环境变量。请参阅向 API Gateway API 发出经过身份验证的请求,查看使用 Authorization:Bearer 标头发送请求的示例代码。

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

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

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

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

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

后续步骤