Google app engine 使用应用程序引擎凭据通过OpenAPI与Google云端点上的应用程序对话进行身份验证
如果使用来验证应用程序引擎应用程序,以与在计算引擎上运行的应用程序通信,该计算引擎使用作为OpenAPI的一部分,则会收到错误响应: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":
{
"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
可以接受的格式,因为它不支持谷歌云控制台可以提供的任何一种格式。有关说明,请参阅