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
相关产品推荐
相关产品推荐

