Postman中通过JWT认证获取DocuSign API访问令牌报错求助
解决Postman中生成DocuSign JWT令牌时
KJUR is not defined错误 核心问题
错误根源是pm.sendRequest是异步操作,第一次运行脚本时,jsrsasign库还未下载完成,就执行了eval(pm.environment.get("jsrsasign")),导致KJUR对象未初始化。另外原脚本还存在参数传递错误的问题。
解决方案
方法一:手动预加载jsrsasign库
- 直接打开jsrsasign库的CDN地址,复制全部代码内容
- 在Postman环境变量中找到
jsrsasign变量,将复制的代码粘贴进去并保存 - 后续脚本运行时可直接调用已缓存的库,无需异步下载
方法二:修改脚本处理异步逻辑(推荐)
将JWT生成逻辑封装为函数,仅在库下载完成后执行:
// 模拟navigator和window对象适配库的运行环境 var navigator = {}; var window = {}; function generateJWT() { eval(pm.environment.get("jsrsasign")); var timestamp = new Date(); var issuedAtTimeSeconds = timestamp / 1000; // 构造JWT头部和载荷 var header = { "typ": "JWT", "alg": "RS256" }; var payload = { "iss": "<integration key>", "sub": "<subscription guid>", "aud": "account-d.docusign.com", "iat": Math.ceil(issuedAtTimeSeconds), "exp": Math.ceil(issuedAtTimeSeconds) + 3600, "scope": "signature impersonation" }; // RS256签名仅需私钥,无需传入公钥 var assertion = KJUR.jws.JWS.sign("RS256", header, payload, pm.environment.get("privatekey")); // 设置请求头 pm.request.headers.add({ key: "Authorization", value: "Bearer " + assertion }); } // 判断库是否已缓存,未缓存则下载后生成JWT,已缓存直接生成 if (!pm.environment.get("jsrsasign")) { pm.sendRequest("https://kjur.github.io/jsrsasign/jsrsasign-all-min.js", function(err, res) { if (err) { console.log(err); } else { console.log("setting jsrsasign"); pm.environment.set("jsrsasign", res.text()); generateJWT(); } }); } else { generateJWT(); }
额外注意事项
- 私钥格式校验:确保环境变量中的私钥是完整PEM格式,包含
-----BEGIN RSA PRIVATE KEY-----和-----END RSA PRIVATE KEY-----,无多余换行或空格 - 参数修正:原脚本错误传入公钥到
JWS.sign方法,RS256签名仅需私钥,公钥用于验证而非签名 - 变量名修正:原脚本中打印的
setting jrassign是拼写错误,需改为jsrsasign避免混淆
内容的提问来源于stack exchange,提问作者abhi
相关产品推荐
相关产品推荐

