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

如何使用GCP服务账号生成访问Google APIs的令牌

使用.NET Core生成GCP服务账号Bearer令牌(无授权同意界面)

核心方案

要跳过OAuth授权同意界面实现GCP操作自动化,GCP服务账号是最优选择。通过服务账号的密钥文件生成Bearer令牌,全程无需用户交互,完全适合服务器端自动化场景。

步骤1:准备服务账号与密钥

  • 登录GCP控制台,创建服务账号,为其分配对应权限(比如Compute Instance Admin权限用于启停虚拟机)
  • 为该服务账号创建并下载JSON格式的密钥文件

步骤2:.NET Core代码实现

直接使用Google官方的Google.Apis.Auth NuGet包简化开发,无需手动处理JWT签名逻辑。

安装依赖包

在项目中执行以下命令安装依赖:

Install-Package Google.Apis.Auth

完整代码示例(含虚拟机停止操作)

using Google.Apis.Auth.OAuth2;
using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;

class GcpVmAutomation
{
    static async Task Main(string[] args)
    {
        // 服务账号密钥文件路径(直接指定本地文件路径即可,无需环境配置)
        string serviceAccountKeyPath = "你的服务账号密钥文件路径.json";
        
        // 定义API访问范围,这里以Compute API为例
        string[] scopes = new[] { "https://www.googleapis.com/auth/compute" };
        
        // 初始化服务账号凭据
        var credential = GoogleCredential.FromFile(serviceAccountKeyPath)
            .CreateScoped(scopes);
        
        // 获取Bearer令牌
        var bearerToken = await credential.UnderlyingCredential.GetAccessTokenForRequestAsync();
        
        // 调用GCP REST API停止指定虚拟机
        string projectId = "你的GCP项目ID";
        string zone = "虚拟机所在区域,如us-central1-a";
        string instanceName = "目标虚拟机名称";
        
        using (var httpClient = new HttpClient())
        {
            httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", bearerToken);
            
            string stopVmApiUrl = $"https://compute.googleapis.com/compute/v1/projects/{projectId}/zones/{zone}/instances/{instanceName}/stop";
            
            var response = await httpClient.PostAsync(stopVmApiUrl, null);
            response.EnsureSuccessStatusCode();
            
            Console.WriteLine("虚拟机已成功停止");
        }
    }
}

关键注意事项

  • 权限配置:必须确保服务账号拥有足够的操作权限,比如启停虚拟机需要roles/compute.instanceAdmin或更细粒度的权限
  • 令牌有效期:生成的Bearer令牌默认有效期1小时,过期后需重新获取
  • 无环境配置:代码直接读取本地密钥文件,无需设置任何环境变量,完全满足你的需求

手动实现方案(无需官方包)

如果不想依赖官方NuGet包,可手动构造JWT并签名:

  1. 从服务账号密钥中提取私钥、客户端ID等信息
  2. 构造JWT的Header(指定RS256签名算法)和Payload(包含iss、scope、aud、exp等必填字段)
  3. 使用RS256算法对JWT进行签名
  4. 向https://oauth2.googleapis.com/token发送POST请求,携带JWT换取Bearer令牌

但官方包已封装所有细节,能避免手动签名的潜在错误,优先推荐使用官方包。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 01:36:29