如何在HTTP POST请求中使用服务账号凭证调用Vertex AI Gemini
直接用HTTP POST调用Vertex AI Gemini模型(基于服务账号凭证)
核心原理
你需要通过OAuth 2.0 JWT Bearer认证流程,用服务账号的凭证生成access token,而非依赖gcloud工具生成的短期token。流程分为三步:
- 用服务账号的私钥生成签名后的JWT
- 用JWT向Google的token服务换取access token
- 用该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
相关产品推荐
相关产品推荐

