使用App Engine凭据进行身份验证,以使用OpenAPI与Google Cloud Endpoints上的应用进行通信

时间:2018-01-23 15:13:24

标签: google-app-engine google-compute-engine google-cloud-endpoints openapi

如果您使用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头。有没有办法用标准库来实现它,所以你可以获得它带来的所有其他好处?

1 个答案:

答案 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