You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Google Cloud Run服务账号认证调用返回403问题排查

问题根因

你的403问题和IAM权限配置无关,是代码错误+Cloud Run鉴权匹配规则共同导致的:

  • target_audience值不匹配:你定义的API_URL结尾带了多余的尾部斜杠/,Cloud Run校验OIDC ID Token时要求target_audience必须和服务根地址完全精确匹配,即格式必须为https://<your-service>.run.app,不能带尾部斜杠、不能带路径,多一个字符都会直接判定token无效返回403。哪怕你给服务账号绑定Owner角色,只要token受众不对,鉴权就不可能通过。
  • 请求头未实际携带:Python requests库的get方法第二个位置参数是URL查询参数(对应params入参),不是请求头。你写的requests.get(f'{API_URL}/health', get_headers())会把认证头字典当成查询参数拼到URL末尾,实际发起请求时根本没有携带Authorization头,等价于匿名访问,自然会被开启了认证校验的服务拦截。
  • 额外说明:你配置的Service Account Token Creator、Service Controller甚至Owner角色对于服务间调用Cloud Run来说都是多余的,只需要给调用方服务账号绑定目标Cloud Run服务的Cloud Run Invoker角色即可满足鉴权要求,多余的权限不会解决问题,反而会带来安全风险。
修复步骤
  1. 修正API_URL定义,去掉尾部斜杠:
API_URL = "https://my-url.run.app"
  1. 修正requests调用的传参,明确指定headers关键字参数,同时补全函数返回值:
def test_request_function():
    response = requests.get(f'{API_URL}/health', headers=get_headers())
    return response
  1. (推荐优化)替换手写JWT签名、换token的逻辑,避免手动实现鉴权流程踩坑。直接用Google官方认证库自动处理token生成、受众匹配、过期刷新逻辑,从根源避免格式错误:
    先安装依赖:
pip install google-auth requests

然后替换原有手写的token生成相关函数:

from google.auth.transport.requests import Request
from google.oauth2.id_token import fetch_id_token

def get_headers():
    auth_request = Request()
    # 自动生成符合Cloud Run要求的ID Token
    id_token = fetch_id_token(auth_request, API_URL)
    return {
        "Authorization": f"Bearer {id_token}"
    }

修复完成后可以先打印get_headers()的返回值确认Authorization头存在,再发起请求即可正常通过鉴权。

内容的提问来源于stack exchange,提问作者marlies_buijs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 10:15:57