使用 App Engine 凭据通过 OpenAPI 与 Google Cloud Endpoints 上的应用程序进行身份验证

Authenticate using App Engine credentials to talk to an app on Google Cloud Endpoints with OpenAPI

如果将 Google Auth Library for Python to authenticate an App Engine app to communicate with an app running on Compute Engine that uses the Extensible Service Proxy (ESP) as part of Cloud Endpoints 与 OpenAPI 一起使用,您会收到错误响应:

{
  "code": 16,
  "message": "JWT validation failed: BAD_FORMAT",
  "details": [{
      "@type": "type.googleapis.com/google.rpc.DebugInfo",
      "stackEntries": [],
      "detail": "auth"
  }]
}

我发现的唯一 sample Cloud Endpoints code 不使用任何库,而是手动构建 JSON Web 令牌 (JWT) 并完全手动设置正确的 HTTP header。有没有一种方法可以使用标准库来做到这一点,这样您就可以获得它带来的所有其他好处?

问题是由于 google.auth.app_engine.Credentials() 在其构建的 JWT 中不包含 aud 声明,而 ESP 需要它。 (我希望我早点找到 Troubleshooting JWT Validation 页面,这样可以节省我自己调查的时间。)

以下是如何构建 ESP 将接受的凭据:

import google.auth.app_engine
import google.auth.jwt
from google.appengine.api import app_identity

AUDIENCE = '...'

credentials = google.auth.jwt.Credentials(
    signer=google.auth.app_engine.Signer(),
    issuer=app_identity.get_service_account_name(),
    subject=app_identity.get_service_account_name(),
    audience=AUDIENCE)

其中 AUDIENCE 必须与您的 OpenAPI 文件中的 x-google-audiences 值匹配 您的 Cloud Endponts 服务名称(有关详细信息,请参阅上面链接的故障排除文档).

只要您传递 --appidentity_private_key_path--appidentity_email_address 标志,此代码甚至可以与 dev_appserver.py 和服务帐户一起使用。但是您需要将服务帐户的私钥转换为 dev_appserver.py 接受的格式,因为它不支持 Google Cloud Console 可以为您提供的任何一种格式。有关说明,请参阅 this bug comment