Google app engine 使用应用程序引擎凭据通过OpenAPI与Google云端点上的应用程序对话进行身份验证

Google app engine 使用应用程序引擎凭据通过OpenAPI与Google云端点上的应用程序对话进行身份验证,google-app-engine,google-compute-engine,google-cloud-endpoints,openapi,Google App Engine,Google Compute Engine,Google Cloud Endpoints,Openapi,如果使用来验证应用程序引擎应用程序,以与在计算引擎上运行的应用程序通信,该计算引擎使用作为OpenAPI的一部分,则会收到错误响应: { "code": 16, "message": "JWT validation failed: BAD_FORMAT", "details": [{ "@type": "type.googleapis.com/google.rpc.DebugInfo", "stackEntries": [], "detail":

如果使用来验证应用程序引擎应用程序,以与在计算引擎上运行的应用程序通信,该计算引擎使用作为OpenAPI的一部分,则会收到错误响应:

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

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

这个问题是由于
google.auth.app\u engine.Credentials()
在它构建的JWTs中不包含
aud
声明,而ESP需要它。(我希望我能早点找到这一页,这样我就可以省下自己调查这件事的几个小时。)

以下是如何构建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)
其中
访问群体
必须与OpenAPI文件中的
x-google-audients
值相匹配您的Cloud Endponts服务名称(有关详细信息,请参阅上面链接的疑难解答文档)

此代码甚至可以与
dev\u appserver.py
和服务帐户一起使用,只要您传递
--appidentity\u private\u key\u路径
--appidentity\u email\u地址
标志。但是您需要将服务帐户的私钥转换为
dev_appserver.py
可以接受的格式,因为它不支持谷歌云控制台可以提供的任何一种格式。有关说明,请参阅