GKE环境使用ADC访问Google Sheets API报权限范围不足错误
问题根因
这个ACCESS_TOKEN_SCOPE_INSUFFICIENT报错和你选oauth2client还是google-auth鉴权库无关,核心原因是GKE环境下通过元数据服务获取的服务账号访问令牌,默认不携带Google Sheets的访问scope,你在代码层面给凭证对象追加scopes的操作在GKE/GCE运行环境下是不生效的。
GCE/GKE实例下发的服务账号令牌的scope列表,是在节点池配置、或者Workload Identity绑定阶段就固定的。代码里调用create_scoped()、给google.auth.default()传scopes参数的写法,仅在本地使用服务账号JSON密钥文件认证时生效,对元数据服务直接签发的令牌没有修改效果。
排查&解决方法
先在运行程序的GKE Pod里执行以下命令,直接拉取当前环境生效的访问令牌,确认scope配置:
curl -H "Metadata-Flavor: Google" http://169.254.169.254/computeMetadata/v1/instance/service-accounts/default/token
把返回结果里的access_token值做JWT解析,查看payload中的scope字段,如果没有https://www.googleapis.com/auth/spreadsheets,就按你实际用的GKE鉴权模式调整配置:
- 如果你直接使用节点默认绑定的Compute Engine服务账号:
- 进入GKE集群对应的节点池配置页,找到「安全-访问范围」设置项
- 不要使用默认的scope配置,要么选择「允许访问所有Google Cloud API」,要么单独勾选Google Sheets对应的权限项
- 保存配置等节点滚动重建完成后,再重新运行程序
生产环境不推荐用这种方案,节点默认SA权限过大,不符合最小权限原则
- 如果你使用Workload Identity做服务账号鉴权(生产环境推荐方案):
- 先确认K8s服务账号绑定的Google IAM服务账号(GSA),已经被添加到目标Google Sheet的分享列表中,根据读写需求给对应编辑/查看权限
- Workload Identity默认签发的令牌自带
https://www.googleapis.com/auth/cloud-platform范围,已经包含Sheets的所有操作权限,如果拿不到对应scope,检查是否给GSA配置过自定义的scope限制,移除限制即可。
代码修正建议
- 废弃oauth2client,这个库已经停止维护很多年,官方统一推荐用google-auth作为替代
- 你贴的google-auth版本代码漏了
build方法的导入,补全后的可用代码如下:
import google.auth from googleapiclient.discovery import build SCOPES = ['https://www.googleapis.com/auth/spreadsheets'] creds, project_id = google.auth.default(scopes=SCOPES) service = build('sheets', 'v4', credentials=creds) sheet = service.spreadsheets() # 替换为你实际的表格ID和取值范围 result = sheet.values().get( spreadsheetId='1kvHv1OBCzr9GnFxRu9RTJC7jjQjc9M4rAiDnhyak2Sg', range='vm_metrics!A10' ).execute() print(result)
内容的提问来源于stack exchange,提问作者Etiksha Jain
相关产品推荐
相关产品推荐

