使用Google服务账号下载Cloud Storage归档文件遇授权错误求助
问题描述
尝试从Cloud Storage存储桶下载Google Vault生成的邮件归档文件时遇到下载问题,使用的Python代码如下:
scopes = ["https://www.googleapis.com/auth/devstorage.full_control"] service_account_file = r"credentials\token.json" currenth_month = current_month creds = Credentials.from_service_account_file(service_account_file, scopes=scopes, subject=execution_email) storage = build("storage", "v1", credentials=creds) for bucket in files_to_download_dict: object_name = files_to_download_dict[bucket]["object_name"] files_request = storage.objects().get_media(bucket=bucket, object=object_name) directory = r"C:...\test" output_folder = path.join(directory, current_month) if not path.isdir(output_folder): mkdir(output_folder) file_name_path = rf"C:file_path" with FileIO(file_name_path, mode="w") as data_buffer: download = MediaIoBaseDownload(data_buffer, files_request) done = False while not done: status, done = download.next_chunk()
遇到两种报错情况:
- 使用旧的有效服务账号密钥时,报错:
invalid grant, not valid user id or email
- 使用同一服务账号的新密钥(已配置所需所有scopes)时,报错类似:Client failed to get access token or doesn't have access to the scopes you need。
已尝试普通Google Web应用凭据(其他模块可用)及Stack Overflow多种方案,均无效,求解决思路。
解决思路
针对第一种报错(invalid grant, not valid user id or email)
- 检查
subject=execution_email参数:该邮箱必须是已授权服务账号进行域范围委派的Google Workspace账号,且账号需存在于你的域内,不能是外部邮箱或已删除账号。 - 确认服务账号已启用域范围委派:在Google Cloud控制台的IAM & Admin > 服务账号页面,找到对应账号,编辑详情并勾选"启用G Suite域范围委派";同时在Google Workspace管理控制台的安全 > API控制 > 域范围委派中,添加该服务账号的客户端ID及所需的存储权限范围。
针对第二种报错(无法获取令牌或权限不足)
- 验证密钥文件有效性:确保新生成的服务账号JSON密钥文件未被修改,且代码中
service_account_file的路径正确指向该文件,避免路径错误导致无法读取凭据。 - 检查权限配置:
- 在Google Cloud控制台的服务账号页面,为该账号添加
devstorage.full_control对应的IAM角色(如Storage Admin),不能仅在代码中指定scope。 - 域范围委派中添加的scope必须包含
https://www.googleapis.com/auth/devstorage.full_control,且无拼写错误。
- 在Google Cloud控制台的服务账号页面,为该账号添加
- 确认存储桶权限:在Cloud Storage控制台直接检查该服务账号对目标存储桶的权限,确保拥有存储对象查看者及以上权限,必要时手动添加角色测试。
其他关键排查点
- 修正文件写入模式:代码中
FileIO(file_name_path, mode="w")需改为mode="wb",因为归档文件是二进制格式,文本模式写入会导致文件损坏或下载失败。 - 放弃Web应用凭据:Web应用凭据不支持域范围委派,而访问Vault生成的归档需要服务账号模拟用户权限,因此必须使用服务账号凭据,无需再尝试Web应用凭据。
内容的提问来源于stack exchange,提问作者pdrferrari
相关产品推荐
相关产品推荐

