YMFE / yapi

YApi 是一个可本地部署的、打通前后端及QA的、可视化的接口管理平台
http://yapi.smart-xwork.cn/
Apache License 2.0
27.36k stars 4.78k forks source link

Pre-request 脚本在服务器端测试时报错 #2108

Open jagerzhang opened 3 years ago

jagerzhang commented 3 years ago

版本号

1.91

什么问题

在 Pre-request 里面写了生成HMAC验签头部的js脚本,内容如下:

/**
 * 使用说明:
 * 1. 将这个文件内容复制到postman的 Pre-Request Script
 * 2. Headers中,设置好:Date/Digest/Authorization,分别为:{{Date}}/{{Digest}}/{{Authorization}}
 * 3. Body里面选择raw,类型使用JSON
 */

var userName = 'aaaa';
var secret = 'bbbbbbbbbbbbbbbb';

var dateObj = new Date();
var gmtTime = dateObj.toGMTString();
var body = context.requestBody;
// var CryptoJS = require("crypto-js");
var sha256 = CryptoJS.SHA256(body);
var digest = `SHA-256=${CryptoJS.enc.Base64.stringify(sha256)}`;

var sinature = CryptoJS.enc.Base64.stringify(CryptoJS.HmacSHA256(`x-date: ${gmtTime}\ndigest: ${digest}`, secret));

context.requestHeader["x-date"] = gmtTime;
context.requestHeader.Digest = digest;
context.requestHeader.Authorization = `hmac username="${userName}", algorithm="hmac-sha256", headers="x-date digest", signature="${sinature}"`;

在API运行界面可以正常运行,但是在服务器端测试时,报错如下: image

看起来是因为服务端环境里面没有 CryptoJS 这个库。

非开发岗,所以求问下各位大佬如何解决这个问题~

var CryptoJS = require("crypto-js"); 用这个则会报require不存在,应该还是服务端引用组件的写法问题。

xiuxiuing commented 3 years ago

看官网的使用示例:

var data = [{ id: 1 }, { id: 2 }];

// Encrypt var ciphertext = context.utils.CryptoJS.AES.encrypt(JSON.stringify(data), 'secret key 123');

// Decrypt var bytes = context.utils.CryptoJS.AES.decrypt(ciphertext.toString(), 'secret key 123'); var decryptedData = JSON.parse(bytes.toString(CryptoJS.enc.Utf8));

console.log('decryptedData', decryptedData);

jagerzhang commented 3 years ago

@xiuxiuing 已按照这个方法解决,非常感谢!