使用域宽授权服务账号调用Data Transfer API遇401错误,Directory API正常
问题场景
尝试通过带域宽授权的服务账号在Google Workspace域内完成用户间Google Drive数据迁移,该服务账号调用Directory API完全正常,但调用Data Transfer API时始终返回如下错误:
401: Request is missing required authentication credential.
已执行的操作
- 在Admin Console > Security > API Controls > Domain-wide delegation中添加了目标服务账号
- 配置的权限范围:
https://www.googleapis.com/auth/admin.directory.userhttps://www.googleapis.com/auth/admin.datatransfer - 源/目标用户均为活跃状态,拥有Google Workspace Business Standard权限且Drive已启用
- 在Google Cloud Console中启用了Data Transfer API
- 等待配置生效,尝试使用新JSON密钥文件,更换多个用户测试
使用代码
creds = service_account.Credentials.from_service_account_file( "service-account.json", scopes=SCOPES ).with_subject("administrator@mydomain.com") dt_service = build('admin', 'datatransfer_v1', credentials=creds) body = { "oldOwnerUserId": "source@mydomain.com", "newOwnerUserId": "dest@mydomain.com", "applicationDataTransfers": [ {"applicationId": "435070579839", "transferAllData": True} ] } dt_service.transfers().insert(body=body).execute()
可能的排查方向
验证模拟的管理员账号权限
服务账号通过模拟administrator@mydomain.com执行操作,该账号必须拥有**数据迁移管理员(Data Transfer Administrator)**角色,或具备admin.datatransfer相关的具体权限。即使服务账号有域宽授权,若被模拟用户本身权限不足,也会触发401错误。检查域宽授权的Scope配置
确认Domain-wide delegation中添加的https://www.googleapis.com/auth/admin.datatransfer无拼写错误、多余空格或隐形字符。建议重新复制完整Scope,或手动输入避免格式问题。确认Data Transfer API的启用项目
检查Google Cloud Console中启用Data Transfer API的项目,是否与服务账号所属项目完全一致。若API启用在其他项目,当前服务账号会因无权限调用返回401。校验Credentials的有效性
在代码中添加打印语句,确认生成的creds对象包含正确的Scope和Subject:print("Scopes:", creds.scopes) print("Subject:", creds.subject)确保构建
dt_service时未错误覆盖credentials,或creds对象未被意外修改。排除令牌缓存问题
旧令牌缓存可能导致权限失效,可尝试删除本地缓存(若存在),或重启运行环境后使用新密钥文件重新生成credentials。
相关情况
不少开发者遇到过类似问题,多数是因为被模拟的管理员账号缺少数据迁移权限,或Scope配置有误导致的。
内容的提问来源于stack exchange,提问作者Paulo Henrique Quintino

