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

如何通过.NET Web API关联的服务账户访问用户Google Drive账户?

实现.NET Web API访问用户Google Drive文件的方案

看起来你已经搞定了服务账户的基础配置,接下来要实现访问用户Drive的核心是解决权限授权的问题,这里有两种最常用的方案,你可以根据业务需求选择:

方案1:用户手动共享文件给服务账户(简单快捷,适合固定文件场景)

这种方式不需要复杂的OAuth流程,只需要用户主动把需要让你的应用访问的文件/文件夹共享给服务账户的邮箱:

  • 首先,从Google Cloud控制台的服务账户详情里复制你的服务账户邮箱(格式类似your-service-account@your-project.iam.gserviceaccount.com)
  • 告知用户将目标文件/文件夹共享给这个邮箱,权限至少设置为「查看者」(如果需要下载文件就够了,要是需要修改就选「编辑者」)
  • 之后你的服务账户就能直接通过DriveService获取这些共享文件了,比如用下面的代码查询:
// 假设你已经初始化好服务账户的DriveService实例
var listRequest = service.Files.List();
// 筛选出共享给服务账户的文件
listRequest.Q = "'your-service-account@your-project.iam.gserviceaccount.com' in readers";
// 指定返回的字段,减少数据传输
listRequest.Fields = "files(id, name, mimeType, webContentLink)";
var fileList = await listRequest.ExecuteAsync();

foreach (var file in fileList.Files)
{
    // 处理文件信息,比如获取下载链接
    Console.WriteLine($"文件名称: {file.Name}, 下载链接: {file.WebContentLink}");
}

方案2:OAuth 2.0授权流程(灵活自动化,适合动态访问用户Drive)

如果需要用户上传文件后你的应用能自动访问,而不用用户手动共享,就需要走OAuth授权,让用户主动授权你的应用访问其Drive:

第一步:配置OAuth同意屏幕

在Google Cloud控制台进入「API和服务」→「OAuth同意屏幕」,填写应用基本信息,然后添加需要的权限范围:

  • 只需要读取文件就选https://www.googleapis.com/auth/drive.readonly
  • 需要上传/修改文件就选https://www.googleapis.com/auth/drive(建议遵循最小权限原则,能用readonly就不用全权限)

第二步:在Web API中实现授权码流程

  1. 引导用户访问Google的授权URL,示例URL格式:
https://accounts.google.com/o/oauth2/v2/auth?client_id=你的OAuth客户端ID&redirect_uri=你的API回调地址&response_type=code&scope=https://www.googleapis.com/auth/drive.readonly&access_type=offline
  • access_type=offline用来获取刷新令牌,方便后续刷新过期的访问令牌
  1. 用户授权后,Google会跳转到你的回调地址,带回code参数
  2. 你的API用这个code请求访问令牌:
var tokenRequestParams = new Dictionary<string, string>
{
    {"client_id", "你的OAuth客户端ID"},
    {"client_secret", "你的OAuth客户端密钥"},
    {"code", "回调带回的code"},
    {"redirect_uri", "你的回调地址"},
    {"grant_type", "authorization_code"}
};

var httpClient = new HttpClient();
var response = await httpClient.PostAsync("https://oauth2.googleapis.com/token", new FormUrlEncodedContent(tokenRequestParams));
var tokenResponse = await response.Content.ReadFromJsonAsync<Dictionary<string, string>>();
// 保存access_token和refresh_token到数据库,关联到用户

第三步:用用户的令牌访问Drive

不用服务账户的凭据,而是用用户的OAuth令牌创建DriveService:

var credential = GoogleCredential.FromAccessToken(tokenResponse["access_token"]);
var userDriveService = new DriveService(new BaseClientService.Initializer()
{
    HttpClientInitializer = credential,
    ApplicationName = "你的应用名称"
});

// 现在可以用这个userDriveService访问该用户的Drive文件了
var userFiles = await userDriveService.Files.List().ExecuteAsync();

你需要向用户获取的信息

  • 如果用方案1:只需要告知用户服务账户邮箱,让他们完成共享操作即可
  • 如果用方案2:需要用户完成OAuth授权流程——也就是点击你提供的授权链接,登录自己的Google账户并同意授权

关键注意事项

  • 服务账户本身没有自己的Drive存储空间,只能访问被共享或被授权的用户Drive内容
  • 权限范围遵循最小化原则,避免请求不必要的权限,减少用户的顾虑
  • 方案2中的refresh_token要妥善存储(加密后存在数据库),它可以用来刷新过期的access_token,不需要用户重新授权

内容的提问来源于stack exchange,提问作者Toto

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:07:08