如何在Cloud Run中正确加载id_token解决Credentials无该属性报错
问题原因
你本地开发时通过gcloud auth application-default login生成的是用户身份OAuth凭证,refresh后会自动填充id_token字段。但Cloud Run环境下google.auth.default()返回的是Compute Engine默认服务账号凭证,这类凭证仅包含访问令牌(access_token),原生不携带id_token属性,无论怎么refresh都无法获取该字段。
解决方案
直接使用谷歌官方提供的id_token.fetch_id_token方法获取ID令牌,该方法会自动适配本地、Cloud Run、GCE等所有谷歌云运行环境,无需手动处理凭证刷新逻辑。
修正后的完整代码
# 新增依赖导入 from google.oauth2 import id_token from google.auth.transport.requests import Request import requests def ProcessPayload(payload): # 替换为你实际请求的目标URL,作为ID令牌的audience(受众) TARGET_URL = "你的实际请求地址" # 自动适配环境获取ID令牌 request = Request() token = id_token.fetch_id_token(request, TARGET_URL) # 发起POST请求 headers = {'Authorization': f'Bearer {token}'} response = requests.post(TARGET_URL, json=payload, headers=headers)
注意事项
- 需确保你的
requirements.txt中包含正确的依赖版本:google-auth>=2.3.0 - 如果请求的目标是另一个Cloud Run服务,需要为当前Cloud Run的服务账号授予
roles/run.invoker权限,否则会返回403错误 - 如果你需要兼容本地测试环境,只要你已经执行过
gcloud auth application-default login,上述代码无需修改即可正常运行
内容的提问来源于stack exchange,提问作者Cyberclops
相关产品推荐
相关产品推荐

