如何为GCP服务账号生成含自定义iss的有效签名JWT适配API网关与云函数
解决方案:生成兼容API网关与云函数的自定义签名JWT
核心要求梳理
先明确两个服务的JWT验证规则:
- API网关:必须匹配你OpenSpec配置的自定义
iss值,签名需通过网关预设的验证方式(JWKS/公钥)。 - 云函数:要求
iss为服务账号邮箱,Payload必须包含email(同服务账号邮箱)、email_verified: true,aud为云函数的完整HTTP触发URL,签名必须使用该服务账号的私钥。
准备工作
确保你已拥有:
- 从GCP控制台下载的服务账号私钥JSON文件
- Node.js环境,并安装依赖:
npm install jsonwebtoken
1. 生成兼容API网关的JWT(自定义iss)
const jwt = require('jsonwebtoken'); const fs = require('fs'); // 加载服务账号私钥 const keyPath = '/path/to/your-service-account-key.json'; const privateKey = fs.readFileSync(keyPath); const serviceAccount = JSON.parse(fs.readFileSync(keyPath)); const payload = { iss: '你的自定义iss值(与OpenSpec的securityDefinition配置完全一致)', sub: serviceAccount.client_email, aud: 'API网关URL或OpenSpec中配置的audience值', exp: Math.floor(Date.now() / 1000) + 3600, // 有效期1小时,不超过GCP限制 iat: Math.floor(Date.now() / 1000) }; // 生成JWT,必须用RS256算法 const apiGatewayToken = jwt.sign(payload, privateKey, { algorithm: 'RS256' }); console.log('API网关可用Token:', apiGatewayToken);
2. 生成兼容云函数的JWT
const jwt = require('jsonwebtoken'); const fs = require('fs'); // 加载服务账号私钥 const keyPath = '/path/to/your-service-account-key.json'; const privateKey = fs.readFileSync(keyPath); const serviceAccount = JSON.parse(fs.readFileSync(keyPath)); const payload = { iss: serviceAccount.client_email, sub: serviceAccount.client_email, email: serviceAccount.client_email, email_verified: true, aud: 'https://your-region-your-project.cloudfunctions.net/your-function', // 云函数完整触发URL exp: Math.floor(Date.now() / 1000) + 3600, iat: Math.floor(Date.now() / 1000) }; // 生成JWT,必须用RS256算法 const cloudFunctionToken = jwt.sign(payload, privateKey, { algorithm: 'RS256' }); console.log('云函数可用Token:', cloudFunctionToken);
可选:让单个JWT兼容两个服务
如果可以修改API网关的OpenSpec配置,将securityDefinitions中的iss值改为服务账号邮箱,那么只需生成一份包含email、email_verified字段,且iss为服务账号邮箱的JWT,即可同时访问API网关和云函数。
内容的提问来源于stack exchange,提问作者Mitesh Agrawal
相关产品推荐
相关产品推荐

