You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何使用密钥对/令牌而非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

火山引擎 最新活动