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

如何在HTTP POST请求中使用服务账号凭证调用Vertex AI Gemini

直接用HTTP POST调用Vertex AI Gemini模型(基于服务账号凭证)

核心原理

你需要通过OAuth 2.0 JWT Bearer认证流程,用服务账号的凭证生成access token,而非依赖gcloud工具生成的短期token。流程分为三步:

  1. 用服务账号的私钥生成签名后的JWT
  2. 用JWT向Google的token服务换取access token
  3. 用该access token作为Authorization头调用Vertex AI API

⚠️ 重要安全提醒:绝对不要在React Native客户端代码中直接嵌入服务账号的private_key。App Store应用的客户端代码可被反编译,私钥泄露会导致你的Google Cloud资源被恶意使用。正确做法是搭建自己的后端服务,由后端处理认证和Vertex AI调用,客户端仅与你的后端交互。

实现步骤(后端示例,仅作流程参考)

以下代码适合在你的后端服务中运行,而非RN客户端:

1. 安装依赖

npm install jsonwebtoken axios

2. 生成JWT并换取Access Token

const jwt = require('jsonwebtoken');
const axios = require('axios');

// 从服务账号.json文件中提取的参数
const SERVICE_ACCOUNT = {
  client_email: 'your-service-account-email@your-project.iam.gserviceaccount.com',
  private_key: '-----BEGIN PRIVATE KEY-----\n...你的私钥内容...\n-----END PRIVATE KEY-----\n',
  token_uri: 'https://oauth2.googleapis.com/token', // 固定的Google token地址
  private_key_id: '你的服务账号private_key_id' // 可选,从.json文件中提取
};

// 生成JWT
function generateJWT() {
  const now = Math.floor(Date.now() / 1000);
  const payload = {
    iss: SERVICE_ACCOUNT.client_email,
    sub: SERVICE_ACCOUNT.client_email,
    aud: SERVICE_ACCOUNT.token_uri,
    exp: now + 3600, // JWT有效期1小时
    iat: now,
    scope: 'https://www.googleapis.com/auth/cloud-platform' // 覆盖Vertex AI的权限范围
  };

  return jwt.sign(payload, SERVICE_ACCOUNT.private_key, {
    algorithm: 'RS256',
    keyid: SERVICE_ACCOUNT.private_key_id
  });
}

// 换取Access Token
async function getAccessToken() {
  const jwtToken = generateJWT();
  const response = await axios.post(SERVICE_ACCOUNT.token_uri, new URLSearchParams({
    grant_type: 'urn:ietf:params:oauth:grant-type:jwt-bearer',
    assertion: jwtToken
  }));

  return response.data.access_token;
}

3. 调用Vertex AI Gemini API

async function callGeminiAPI(updatedChat, generationConfig, safetySettings) {
  const accessToken = await getAccessToken();
  const apiUrl = 'https://us-central1-aiplatform.googleapis.com/v1/projects/blue-mag-27271/locations/us-central1/publishers/google/models/gemini-1.0-pro:streamGenerateContent?alt=sse';

  const response = await axios.post(apiUrl, {
    contents: updatedChat,
    generationConfig: generationConfig,
    safetySettings: safetySettings
  }, {
    headers: {
      'Authorization': `Bearer ${accessToken}`,
      'Content-Type': 'application/json'
    },
    // 适配SSE流式响应的配置(根据axios版本调整)
    responseType: 'stream'
  });

  return response;
}

客户端适配建议

在你的React Native应用中,不要直接处理认证逻辑,而是:

  • 向你的后端API发送聊天请求
  • 后端完成上述认证和Vertex AI调用流程
  • 将Gemini的响应返回给RN客户端

这样既避免了安全风险,也简化了客户端的逻辑。

补充说明

  • Access Token仍然会在1小时后过期,你可以在后端实现自动刷新逻辑(比如在token过期前重新生成)
  • 确保服务账号已被授予Vertex AI User或相关的权限(在Google Cloud IAM中配置)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 17:42:17