Google Drive服务账号身份验证凭据无法正常使用问题咨询
我通过以下代码从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è

