如果您使用Google Auth Library for Python对App Engine应用进行身份验证,以便与运行在Compute Engine上的应用进行通信,该应用使用Extensible Service Proxy (ESP)作为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头。有没有办法用标准库来实现它,所以你可以获得它带来的所有其他好处?
答案 0 :(得分:1)
问题是由于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服务名称(有关详细信息,请参阅上面链接的疑难解答文档)。
只要您传递dev_appserver.py
和--appidentity_private_key_path
标记,此代码甚至可以与--appidentity_email_address
和服务帐户一起使用。但是,您需要将服务帐户的私钥转换为dev_appserver.py
接受的格式,因为它不支持Google Cloud Console可以为您提供的任何格式。有关说明,请参阅this bug comment。