如何通过Google Drive API v3使用服务账号创建共享驱动器?权限报错及权限配置咨询
服务账号创建Google共享驱动器的权限配置方案
问题1:是否可以使用服务账号创建共享驱动器?
是的,完全可以,但服务账号本身不属于你的Google Workspace域,默认无法直接操作域内的共享驱动器资源,必须通过**域范围委派(Domain-Wide Delegation)**结合Workspace权限配置来实现。
问题2:服务账号需要配置哪些权限?
你需要完成以下几个关键配置步骤,缺一不可:
1. 启用服务账号的域范围委派
首先在GCP控制台操作:
- 找到你的服务账号,进入详情页后点击「编辑」,勾选「启用Google Workspace域范围委派」
- 记录服务账号的客户端ID(在服务账号详情页的「客户端ID」字段)
然后切换到Google Workspace Admin控制台(admin.google.com):
- 进入「安全」→「API控制」→「域范围委派」
- 点击「添加新的」,输入刚才记录的客户端ID,然后添加OAuth授权范围:
https://www.googleapis.com/auth/drive(如果需要最小权限,也可以用https://www.googleapis.com/auth/drive.drive),最后保存。
2. 给服务账号分配Workspace创建共享驱动器的权限
共享驱动器是Google Workspace的域级资源,必须在Workspace Admin中配置权限:
- 进入「应用」→「Google Workspace」→「驱动器和文档」→「共享驱动器设置」
- 在「谁可以创建共享驱动器」部分,点击「添加用户或群组」,输入你的服务账号邮箱(格式为
[service-account-id]@[project-id].iam.gserviceaccount.com),保存设置。 - 如果你需要更精细化的权限管理,可以创建一个自定义Workspace角色,添加「创建共享驱动器」权限,再将服务账号加入该角色。
3. 代码中使用域内用户身份委派
服务账号本身不在域内,所以需要模拟一个你的Workspace域内拥有创建共享驱动器权限的用户(比如你自己的账号)来执行操作。修改你的代码如下:
import uuid from googleapiclient.discovery import build from google.oauth2 import service_account # 替换为你的服务账号密钥文件路径 SERVICE_ACCOUNT_FILE = 'path/to/your/service-account-key.json' # 授权范围 SCOPES = ['https://www.googleapis.com/auth/drive'] # 替换为你Workspace域内有创建共享驱动器权限的账号邮箱 DELEGATED_USER_EMAIL = 'your-workspace-account@your-domain.com' # 加载服务账号凭证 credentials = service_account.Credentials.from_service_account_file( SERVICE_ACCOUNT_FILE, scopes=SCOPES) # 模拟域内用户身份 delegated_credentials = credentials.with_subject(DELEGATED_USER_EMAIL) # 构建Drive服务 service = build('drive', 'v3', credentials=delegated_credentials) drive_metadata = {'name': 'Test shared drive'} request_id = str(uuid.uuid4()) drive = service.drives().create( body=drive_metadata, requestId=request_id, fields='id' ).execute() drive_id = drive.get('id') print(f'Drive ID: {drive_id}')
为什么之前会出现403错误?
你之前的代码直接使用服务账号自身身份调用API,但服务账号不属于你的Workspace域,默认没有域内共享驱动器的创建权限,也没有模拟域内用户,因此被Google Drive API拒绝访问。
内容的提问来源于stack exchange,提问作者Sergio
相关产品推荐
相关产品推荐

