对 Google 云端点 API 进行授权调用

Making Authorized Calls to an Google Cloud Endpoints API

我当前的设置

echo 教程已上线 运行。我可以在我的机器上使用 python 脚本调用打开端点和需要 API 密钥的端点。我无法使用 Google ID 令牌进行授权的 API 调用。到目前为止,Google 个示例中的 None 个都有效。

据我了解,工作流程应该是

  1. 使用密钥文件授权服务账号生成JWT。
  2. 使用 JWT 生成 Google ID 令牌。

Google 示例:https://cloud.google.com/endpoints/docs/openapi/service-account-authentication#using_a_google_id_token(密钥文件) 代码失败。函数 get_id_token() return res['id_token'] 失败,res.

中没有 id_token

有没有人让这个例子起作用?有没有人有使用来自服务帐户的 Google ID 令牌对端点 API 进行授权 API 调用的示例?

主要问题是生成 JWT,适用于我的代码如下。我还没有找到更好的方法来做到这一点。如果您知道更好的方法,请在下面提交您的答案或添加评论。从 JWT 生成 Google ID 令牌的代码完全来自 Google 此处的文档 (https://github.com/GoogleCloudPlatform/python-docs-samples/blob/master/endpoints/getting-started/clients/service_to_service_google_id_token/main.py) get_id_token 函数。

def generate_jwt(audience, json_keyfile, service_account_email):
"""Generates a signed JSON Web Token using a Google API Service Account.
    https://github.com/GoogleCloudPlatform/python-docs-samples/blob/master/endpoints/getting-started/clients/google-jwt-client.py
"""

# Note: this sample shows how to manually create the JWT for the purposes
# of showing how the authentication works, but you can use
# google.auth.jwt.Credentials to automatically create the JWT.
#   http://google-auth.readthedocs.io/en/latest/reference/google.auth.jwt.html#google.auth.jwt.Credentials

signer = google.auth.crypt.RSASigner.from_service_account_file(json_keyfile)

now = int(time.time())
expires = now + 3600  # One hour in seconds

payload = {
    'iat': now,
    'exp': expires,
    'aud': 'https://www.googleapis.com/oauth2/v4/token',
    # target_audience must match 'audience' in the security configuration in your
    # openapi spec. It can be any string.
    'target_audience': audience,
    'iss': service_account_email
}

jwt = google.auth.jwt.encode(signer, payload)

return jwt