Google Cloud Storage API无法生成访问令牌、访问被拒绝问题求助
问题排查与解决方案
错误根因
你收到的PERMISSION_DENIED报错核心原因是调用服务账号generateAccessToken接口时,调用方需要单独持有目标服务账号的**服务账号令牌创建者(roles/iam.serviceAccountTokenCreator)**角色,该权限不会被项目Owner角色默认继承,需要单独配置。
除此之外你原curl命令中-X POST /的多余斜杠也会导致请求路径异常。
分步修复步骤
- 步骤1:为你的工作邮箱授予服务账号令牌创建者权限,执行以下gcloud命令:
gcloud iam service-accounts add-iam-policy-binding content-uploader@kol-hatorah-kulah.iam.gserviceaccount.com \ --member=user:替换为你的工作邮箱地址 \ --role=roles/iam.serviceAccountTokenCreator
- 步骤2:对齐应用默认凭据(ADC)和你使用的工作账号,
gcloud config list显示的账号和gcloud auth application-default对应的凭据是两套独立体系,执行以下命令重新登录ADC:
gcloud auth application-default login
在弹出的浏览器窗口中选择你的工作邮箱完成授权即可。
- 步骤3:确认
Documents/request.json配置符合要求,必须指定GCS上传对应的作用域,示例配置如下:
{ "scope": ["https://www.googleapis.com/auth/devstorage.read_write"], "lifetime": "3600s" }
- 步骤4:使用修正后的curl命令发起请求:
curl -X POST \ -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \ -H "Content-Type: application/json; charset=utf-8" \ -d @Documents/request.json \ https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/content-uploader@kol-hatorah-kulah.iam.gserviceaccount.com:generateAccessToken
更简便的长期GCS上传方案
如果你的核心需求只是用服务账号长期上传文件到GCS,不需要自行调用接口生成访问令牌,可直接使用官方原生鉴权方案:
- 在GCP控制台下载目标服务账号的JSON格式密钥文件
- 配置本地环境变量:
export GOOGLE_APPLICATION_CREDENTIALS=替换为你的服务账号密钥文件本地路径
- 直接使用gcloud命令上传文件即可自动完成鉴权:
gcloud storage cp 本地文件路径 gs://目标存储桶名称/存储路径
内容的提问来源于stack exchange,提问作者David Reese
相关产品推荐
相关产品推荐

