如何使用密钥对/令牌而非Gmail账号在C#中访问Google Cloud Storage?
用服务账号密钥实现C#上传Google Cloud Storage(替代Gmail账号授权)
兄弟,完全可以用服务账号密钥来替代Gmail账号授权,实现和那篇文章一模一样的GCS上传功能——这也是Google官方推荐的非交互式场景(比如后台服务、定时任务)的认证方式,根本不需要涉及个人Gmail账号。我给你一步步拆解怎么做:
1. 准备服务账号与密钥文件
首先得在Google Cloud控制台搞定服务账号和凭证:
- 登录Google Cloud控制台,进入你的目标项目,导航到IAM与管理 > 服务账号
- 新建一个服务账号(或者用已有的),给它分配Storage Object Creator权限(如果只需要上传功能),测试阶段也可以用Storage Admin全权限
- 给这个服务账号创建密钥:点击服务账号详情页的密钥标签 → 添加密钥 → 创建新密钥,选择JSON格式,下载密钥文件(这个文件是核心凭证,务必妥善保管,别泄露)
2. 配置项目依赖
和原文章一样,需要安装Google的GCS SDK NuGet包:
用NuGet包管理器安装,或者用.NET CLI命令:
dotnet add package Google.Cloud.Storage.V1
3. 核心上传代码(替换Gmail授权逻辑)
这里直接替换原文章中Gmail授权的部分,改用服务账号密钥认证,上传逻辑和原文章完全一致:
方式一:本地加载密钥文件(测试用)
适合开发测试阶段,直接指定密钥文件路径:
using Google.Cloud.Storage.V1; using Google.Apis.Auth.OAuth2; using System.IO; public async Task UploadFileToGcs(string bucketName, string localFilepath, string gcsObjectName) { // 加载服务账号JSON密钥文件 var credential = GoogleCredential.FromFile("你的密钥文件路径,比如:./my-service-account-key.json"); // 创建授权后的Storage客户端 var storageClient = StorageClient.Create(credential); // 上传逻辑和原文章完全一致 using var fileStream = File.OpenRead(localFilepath); await storageClient.UploadObjectAsync(bucketName, gcsObjectName, null, fileStream); Console.WriteLine($"文件 {gcsObjectName} 已成功上传到存储桶 {bucketName}"); }
方式二:环境变量加载(生产环境推荐)
生产环境不要硬编码文件路径,通过环境变量GOOGLE_APPLICATION_CREDENTIALS指向密钥文件,代码更简洁安全:
using Google.Cloud.Storage.V1; using System.IO; public async Task UploadFileToGcs(string bucketName, string localFilepath, string gcsObjectName) { // 自动从环境变量读取凭证,无需手动加载文件 var storageClient = StorageClient.Create(); // 上传逻辑和原文章完全一致 using var fileStream = File.OpenRead(localFilepath); await storageClient.UploadObjectAsync(bucketName, gcsObjectName, null, fileStream); }
设置环境变量的方法:
- Windows命令行:
set GOOGLE_APPLICATION_CREDENTIALS=你的密钥文件绝对路径 - Linux/macOS终端:
export GOOGLE_APPLICATION_CREDENTIALS=你的密钥文件绝对路径
4. 验证存储桶权限
别忘记给服务账号分配存储桶的操作权限:
- 进入GCS控制台,找到目标存储桶 → 权限标签 → 添加成员
- 输入服务账号的邮箱(可以从密钥文件的
client_email字段找到),分配Storage Object Creator角色 - 保存后等待1-2分钟让权限生效
为什么不用API密钥?
提一句:API密钥只适合公开只读的场景(比如前端加载公开的GCS文件),无法用于上传这类需要写入权限的操作,所以服务账号才是正确的选择。
内容的提问来源于stack exchange,提问作者Daniel Williams




