使用GCP服务账户通过gspread创建表格时遭遇403权限不足错误
解决GCP服务账户通过gspread创建Google表格的403权限不足错误
错误核心分析
从错误详情来看,问题出在调用drive.googleapis.com的DriveFiles.Create方法时,访问令牌的作用域不足,同时服务账户缺少必要的Drive操作权限。
解决方案步骤
1. 为服务账户分配正确的Drive角色
- 进入GCP IAM控制台,定位到触发错误的服务账户
- 点击服务账户的「编辑」按钮,添加以下任一角色(遵循最小权限原则选择):
- Drive File Creator(
roles/drive.fileCreator):允许创建新Drive文件,仅能访问自身创建的文件 - Editor(
roles/editor):项目级编辑权限,包含Drive文件的创建与管理权限 - Drive Admin(
roles/drive.admin):全Drive管理权限(仅必要时使用)
- Drive File Creator(
- 保存角色分配后,等待5-10分钟让GCP权限同步生效
2. 检查VM实例的服务账户作用域配置
由于使用的是绑定到VM的服务账户,VM元数据的作用域限制可能会覆盖代码中的设置:
- 进入GCP Compute Engine控制台,找到目标VM实例
- 点击「编辑」按钮,展开「服务账户」区域
- 确保已勾选
Google Drive API相关作用域,或临时选择「允许全部Cloud API访问权限」测试(生产环境建议严格限制) - 保存配置后重启VM,元数据变更需重启才能生效
3. 验证代码中的作用域实际生效
在代码中添加打印语句,确认凭证的作用域是否正确加载:
from google.auth import default import gspread credentials, _ = default(scopes=["https://www.googleapis.com/auth/drive"]) # 打印实际生效的作用域 print("当前凭证作用域:", credentials.scopes) gc = gspread.authorize(credentials) sheet_name = 'test_service_account' sh = gc.create(sheet_name)
如果打印的作用域不包含https://www.googleapis.com/auth/drive,说明VM元数据作用域覆盖了代码设置,需回到步骤2调整VM配置。
4. 对比正常服务账户的配置差异
参考你提到的另一个可正常创建表格的服务账户,对比两者的:
- IAM角色分配列表
- 绑定的VM实例作用域设置
- 代码中的作用域配置
将差异同步到问题服务账户即可解决问题
内容的提问来源于stack exchange,提问作者Vipul Vishnu av
相关产品推荐
相关产品推荐

