You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Google Drive服务账号身份验证凭据无法正常使用问题咨询

问题:服务账号调用Google Drive API提示未授权,但Sheets API正常工作

我通过以下代码从JSON文件创建Google服务账号凭据:

using var stream = new FileStream(credentialFileName, FileMode.Open, FileAccess.Read);
var credentials = ServiceAccountCredential.FromServiceAccountData(stream);

该服务账号已配置域范围委派,并拥有以下权限范围:

  • https://www.googleapis.com/auth/drive
  • https://www.googleapis.com/auth/spreadsheets

随后我使用该凭据创建DriveService和SheetsService对象:

sheetService = new SheetsService(new BaseClientService.Initializer
{
    HttpClientInitializer = credentials
});
driveService = new DriveService(new BaseClientService.Initializer
{
    HttpClientInitializer = credentials
});

我能正常与Google Sheets API交互,读写操作均无问题。但当尝试调用Google Drive API时,却因身份验证失败无法正常工作,示例代码如下:

var fileListRequest = DriveService.Files.List();
fileListRequest.Q = $"'{gDriveFolderID}' in parents";
var fileList = await fileListRequest.ExecuteAsync();

抛出异常:

"The service drive has thrown an exception. HttpStatusCode is Unauthorized. Request had invalid authentication credentials. Expected OAuth 2 access token, login cookie or other valid authentication credential."

改用浏览器授权的OAuth 2.0客户端ID验证可正常工作,但该方式会过期;虽然可以用刷新令牌,但最终也会过期,而服务账号正是为了处理内部数据时避免频繁刷新身份验证。


解决方案

1. 补全域范围委派的完整配置

域范围委派并非仅在服务账号页面勾选即可,还需在Google Workspace管理控制台完成授权:

  • 登录Google Workspace管理员后台,进入「安全性」>「API控制」>「域范围委派」
  • 添加服务账号的客户端ID(可在Google Cloud控制台的服务账号详情页获取),并填入包含https://www.googleapis.com/auth/drive在内的权限范围
  • 保存配置后等待15-30分钟,让权限生效

2. 让服务账号模拟域内用户身份

域范围委派的核心是让服务账号模拟域内用户操作资源,直接使用原始ServiceAccountCredential不会自动完成模拟,这是Drive API授权失败的关键(Sheets API部分场景允许无模拟访问,但Drive API要求严格)。修改凭据创建代码:

using var stream = new FileStream(credentialFileName, FileMode.Open, FileAccess.Read);
var credential = ServiceAccountCredential.FromServiceAccountData(stream);
// 替换为你域内的有效用户邮箱,如admin@yourdomain.com
var impersonatedCredential = credential.CreateWithUser("user@yourdomain.com");

使用模拟后的凭据初始化服务:

sheetService = new SheetsService(new BaseClientService.Initializer
{
    HttpClientInitializer = impersonatedCredential
});
driveService = new DriveService(new BaseClientService.Initializer
{
    HttpClientInitializer = impersonatedCredential
});

3. 验证目标Drive文件夹的权限

确保你模拟的用户(或服务账号本身)对目标gDriveFolderID文件夹拥有足够权限(至少「查看者」以上)。若文件夹由域内用户创建,需手动共享给服务账号邮箱,或让模拟用户具备该文件夹的访问权限。

4. 确认Google Drive API已启用

检查Google Cloud控制台中Google Drive API的启用状态:

  • 进入Google Cloud控制台,搜索「Drive API」
  • 确保API处于「已启用」状态(Sheets API已启用所以能正常工作,但Drive API可能被遗漏启用)

内容的提问来源于stack exchange,提问作者Manuel Venè

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 18:10:28