20241209 API接口调试工具进阶使用-自动签名
应用背景
API进行调试的时候,服务端会对接口数据进行校验,避免接口被滥用,我们就需要对请求数据进行签名
例如请求
{
"id":"1",
"type":"99",
"pageNum":"2"
}
最后经过这么一签名
{
"id":"1",
"type":"99",
"pageNum":"2",
"timestamp":"1733676142",
"sign":"E2F42D80274469B439CE00D002DABB24"
}
难不成我们每次请求数据的时候就要进行计算,签名吗?
那不得多累呀或者启动代码进行签名然后请求?,最后根据第三方给的小脚本,让我对这个自动化签名可以一窥一二
let postData = request.data;
let signData = {};
let timestamp = (new Date()).getTime().toString();
timestamp = timestamp.substr(0, 10);
// timestamp = "1686900285";
console.log(timestamp);
pm.environment.set("TIME_STAMP", timestamp);
// 正式场
// signData["secret"] = "9ec720bb154b8fa530a93dc4408b29ce";
// 测试场
signData["secret"] = "316ceb36049ced2bfb65fa844742b145";
// signData["secret"] = "7dd19d48d0ed3d13e5e4c51fef1256f3";
for (let key in postData) {
if (key == "sign" || key == "trace" || key == "debug" || postData[key] == "") {
continue;
}
signData[key] = postData[key];
}
signData["timestamp"] = timestamp;
signData = objSort(signData);
signData = urlEncode(signData);
console.log(signData);
signData = CryptoJS.MD5(signData).toString().toUpperCase();
// console.log(signData);
//postman.setGlobalVariable("OPEN_SIGN", signData);
pm.environment.set("OPEN_SIGN", signData);
console.log(signData);
//排序方法
function objSort(obj) {
let keys = Object.keys(obj).sort();
let arr = {};
for (let i in keys) {
arr[keys[i]] = obj[keys[i]];
}
return arr;
}
/**
* param 将要转为URL参数字符串的对象
* key URL参数字符串的前缀
* encode true/false 是否进行URL编码,默认为true
*
* return URL参数字符串
*/
function urlEncode(param, key, encode) {
if (param == null) return '';
var paramStr = '';
var t = typeof (param);
if (t == 'string' || t == 'number' || t == 'boolean') {
paramStr += '&' + key + '=' + ((encode == null || encode) ? encodeURIComponent(param) : param);
} else {
for (var i in param) {
var k = key == null ? i : key + (param instanceof Array ? '[' + i + ']' : '.' + i);
paramStr += urlEncode(param[i], k, encode);
if (paramStr.substr(0, 1) == '&') paramStr = paramStr.substr(1);
}
}
return paramStr;
};
可以看到先是对请求数据进行排序,然后对请求数据字符串拼接,最后MD5计算,签名完毕
设置环境 pm.environment.set("","");
使用签名,请求体里面取值
设置过程,如下
使用过程