本页介绍如何在 Cloud Endpoints 中支持用户身份验证。
要对用户进行身份验证,客户端应用程序必须将 HTTP 请求的授权标头中的 JSON Web 令牌(JWT)发送到您的后端 API。Extensible Service Proxy(ESP)代表您的 API 验证令牌,因此您无需在API中添加任何代码即可处理身份验证。不过,您需要配置 OpenAPI 文档以支持您选择的身份验证方法。
ESP 使用 JWT 颁发者的公钥高效地验证 JWT。ESP 缓存公钥 5 分钟。此外,ESP 会缓存经过验证的 JWT 五分钟或直到 JWT 到期,以先发生者为准。
准备工作
- 根据身份验证方法提供的文档,将身份验证代码添加到客户端应用。
- 当客户端应用发送 HTTP 请求时,请求中的授权标头必须包含以下 JWT 声明:
iss
(颁发者)sub
(主题)aud
(受众群体)iat
(颁发时间)exp
(到期时间)
配置 ESP 以支持客户端身份验证
OpenAPI 文档中必须包含安全要求对象和安全性定义对象,ESP 才能验证签名的 JWT 中的声明。
要支持自定义身份验证,请执行以下操作:
将以下代码添加到 OpenAPI 文档中的安全性定义中:
securityDefinitions: your_custom_auth_id: authorizationUrl: "" flow: "implicit" type: "oauth2" # The value below should be unique x-google-issuer: "issuer of the token" x-google-jwks_uri: "url to the public key" # Optional. Replace YOUR-CLIENT-ID with your client ID x-google-audiences: "YOUR-CLIENT-ID"
在 API 级别添加安全性部分以应用于整个 API,或在方法级别应用以应用于特定方法。
security: - your_custom_auth_id: []
您可以在 OpenAPI 文档中定义多个安全定义,但每个定义都必须有不同的颁发者。如果同时在 API 级层和方法级层使用 security 部分,则方法级层的设置将覆盖 API 级层的设置。
不需要 x-google-audiences
字段。ESP 在 aud
声明中接受所有 https://SERVICE_NAME
格式的后端服务名称的 JWT。要允许其他客户端 ID 访问后端服务,您可以使用以逗号分隔的值在 x-google-audiences
字段中指定允许的客户端 ID。然后,ESP 会在 aud
声明中接受任何具有指定客户端 ID 的 JWT。
ESP 支持 x-google-jwks_uri
OpenAPI 扩展定义的两种非对称公钥格式:
-
JWK 集格式。
例如:
x-google-jwks_uri: "https://YOUR_ACCOUNT_NAME.YOUR_AUTH_PROVIDER_URL/.well-known/jwks.json"
-
X509。例如:
x-google-jwks_uri: "https://www.googleapis.com/service_accounts/v1/metadata/x509/securetoken@system.gserviceaccount.com"
如果您使用的是对称密钥格式,请将 x-google-jwks_uri
设置为包含 base64url 编码密钥字符串的文件的 URI。
如果省略 x-google-jwks_uri
,ESP 将遵循 OpenID Connect Discovery 协议自动发现给定 OpenID 提供商的 JWKS URI。ESP 将向 x-google-issuer/.well-known/openid-configuration
发送请求,解析 JSON 响应,以及从顶级 jwks_uri
字段读取 JWKS URI。
请注意,省略 x-google-jwks_uri
会导致较长的冷启动时间,因为 ESP 必须在启动时进行额外的远程调用。因此,如果 JWKS URI 经常发生更改,建议您仅省略此字段。
大多数认证的 OpenID 提供商(例如 Google、Auth0 和 Okta)拥有稳定的 JWKS URI。
您还可以通过添加 x-google-extensions
来自定义 JWT 位置。如需了解详情,请参阅 openAPI 扩展程序。
向 Endpoints API 发出经过身份验证的调用
当您使用身份验证令牌发送请求时,出于安全考虑,我们建议您将令牌放在 Authorization:Bearer
标头中。例如:
curl -H "Authorization: Bearer ${TOKEN}" "${ENDPOINTS_HOST}/echo"
其中 ENDPOINTS_HOST
和 TOKEN
分别是包含 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。
后续步骤