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

Postman预请求脚本生成Google API的RS256 JWT遇阻求助

解决Postman中用RS256生成Google API JWT的问题

你说得对,CryptoJS确实不支持RS256签名——它只提供了HMAC系列的对称加密算法,而RS256属于非对称的RSA签名算法,得用专门支持RSA的库来处理。好在Postman的预请求脚本沙箱里内置了forge库,它可以完美处理RSA私钥签名,下面是修改后的完整脚本:

function base64url(source) { 
    // Encode in classical base64 
    encodedSource = CryptoJS.enc.Base64.stringify(source); 
    // Remove padding equal characters 
    encodedSource = encodedSource.replace(/=+$/, ''); 
    // Replace characters according to base64url specifications 
    encodedSource = encodedSource.replace(/\+/g, '-'); 
    encodedSource = encodedSource.replace(/\//g, '_'); 
    return encodedSource; 
} 

function addIAT(data) { 
    var iat = Math.floor(Date.now() / 1000) - 100; 
    data.iat = iat; 
    return data; 
} 

function addEXP(data) { 
    var exp = Math.floor(Date.now() / 1000) + 3300; 
    data.exp = exp; 
    return data; 
} 

var header = { 
    "alg": "RS256", 
    "typ": "JWT", 
    "kid": "xxx" 
}; 

var data = { 
    "iss": "xxx@iam.gserviceaccount.com", 
    "aud": "https://oauth2.googleapis.com/token", 
    "scope": "https://www.googleapis.com/auth/cloud-platform" 
}; 

data = addIAT(data); 
data = addEXP(data); 

var privateKEY = "-----BEGIN PRIVATE KEY-----xxxxxxxxxxxxxxxLcGGNkna2Y3URoT0vDNneqzaasmJk4JZ97BcFLOulTihA49z8zmQKBgQDKX9AWS88cnfyiXSxtRNUFYvN4SzMDTJ1o59Gm6Sk77t7Ylfm+8PKA00SQeN7FuU/cbU4PkbAyzcp7eAGE3KXoLC/pWQ14srWGAsQkti1PmBo400ajRQReJPs3XxIl3yl4swlRgn+w9x6xy3CRnWrZRQSxRrtdDkBJcp7Lml+4mwKBgQCCeiTsktlMTOy9LqxOUMh6Lt7Z5jceNSwusW8Z4YVsewiSsRezufLBRcTywifgPOyUTP3S7etEfW2CKF0smpM0drfxd/3Ic7oKr7ESY5zwNcV7Q3NUGxaqGy8yoxEhKkLsYkOzYUdyNyfJd5Sh8yq7ICrX7/UGkVLOi44VrdaluQKBgC3kmH3V5zvoH/h6BK8q4tv72pa3BvSClVfK6mJdkbpDq0mWiTJh1bydLHlOz8YrBg9IwmEJetmqjXZ+emm01/LUwnC6fzGV5VBkpDJnFdNs/NVSJDy2VA09ebLO3oC0IOV8RGq1m1t4Tv+m0PpUpnxrCGtjTO4HY1DEq3okofxtAoGABjq4QegVIlImU5LSAEKgnUiwA1CHGW3+ZzfCczAv2VRfk/DSlYLmsxLRIfjsCVEo79NiVGyIsKmt5TJRxVLXp++ydKCEN/YRrjqEFgHNoH0rDCuV/IKAeN17/TYKphuebSX6mVsfo7GXI1kSoGJkDDnPKR4peiIF/YC9BTqQgIs=-----END PRIVATE KEY-----";

// encode header 
var stringifiedHeader = CryptoJS.enc.Utf8.parse(JSON.stringify(header)); 
var encodedHeader = base64url(stringifiedHeader); 

// encode data 
var stringifiedData = CryptoJS.enc.Utf8.parse(JSON.stringify(data)); 
var encodedData = base64url(stringifiedData); 

// build token 
var token = encodedHeader + "." + encodedData;

// 使用forge库处理RSA签名
try {
    // 解析PEM格式的私钥
    var privateKey = forge.pki.privateKeyFromPEM(privateKEY);
    
    // 创建SHA256哈希对象
    var md = forge.md.sha256.create();
    md.update(token, 'utf8');
    
    // 用私钥签名哈希结果
    var signature = privateKey.sign(md);
    
    // 将签名转为base64并处理成url安全格式
    var signatureBase64 = forge.util.encode64(signature);
    var signedToken = signatureBase64.replace(/=+$/, '').replace(/\+/g, '-').replace(/\//g, '_');
    
    var jwt = token + "." + signedToken;
    postman.setEnvironmentVariable("payload", jwt);
} catch (error) {
    console.error("签名失败:", error.message);
}

关键修改说明:

  • 替换签名逻辑:去掉了不存在的CryptoJS.RS256调用,改用Postman内置的forge库处理RSA签名。
  • 私钥解析:用forge.pki.privateKeyFromPEM()把你的PEM格式私钥转换成forge能识别的私钥对象。
  • 哈希与签名:先对header.payload进行SHA256哈希,再用私钥对哈希值签名,这符合RS256的签名规范(RSASSA-PKCS1-v1_5 + SHA256)。
  • 签名转base64url:把forge生成的base64签名转换成JWT要求的url安全格式(替换+为-,/为_,去掉末尾的=)。

这样修改后,你的脚本就能正确生成符合Google API要求的RS256签名JWT了。

内容的提问来源于stack exchange,提问作者D Smith

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:50:24