使用postman对请求自动加签名

我们的接口全部做了签名处理,做接口调试的时候可能需要频繁的注释掉后端验签的方法,虽然麻烦,但是可以正常调试。但是如果需要请求一下线上的数据,总不能把线上的验签注释掉吧。
postman是我常用的一个接口测试工具,使用 Pre-request Script 功能在发出请求前执行一些脚本,来达到签名的目的。
Pre-request Script是通过Postman的沙盒(Sandbox)来实现的,而Sandbox是一个JavaScript执行环境,里面内置了一部分常用的JS库和函数。所以我们其实是通过编写JavaScript代码,代码在请求发出前先被执行,从而达到自动生成签名的目的。

首先切换到 pre-request script 窗口,如下图
使用postman对请求自动加签名_第1张图片

获取要签名的参数

我们需要签名的参数会通过get或post传递,所以先要获取到get参数和post参数。
我们以请求 a.com?ab=xxx为例,
get传参为:ab=“xxx”
post 传参为:code=“yyy”

post 参数

在我用的这个版本里,post参数比较好拿到,通过request 对象的data属性可以拿到,获取到的结果是一个对象。

let param = request.data;
console.log(param);

使用postman对请求自动加签名_第2张图片

get参数

get参数折腾了半天,通过多次尝试,在 pm.request.url.query.members 这个结构中拿到了

let queryParam = pm.request.url.query.members;
console.log(queryParam);

使用postman对请求自动加签名_第3张图片

整合get参数和post参数

需要遍历该数组,整理成一个对象,然后再与post得到的参数合并到一个对象,还需要去除sign字段,因为sign字段不能参与签名(这里的sign从哪来的,后面有说明)。过程如下(time是我们的一个校验参数,可忽略):

//将post和get合并,并且移除sign参数
for (let i in queryParam) {
    if (queryParam[i].key == "sign") {
        continue;
    }
    param[queryParam[i].key] = queryParam[i].value;
}
//时间戳参数
param.time = (new Date()).getTime().toString();
pm.environment.set("reqtime", param.time);
签名

我们的签名方法是,先对所有需要签名的参数按照键进行排序,将排序好的参数生成json字符串,然后进行sha1运算,再sha1的结果进行md5运算,个人感觉没必要进行两次运算。当然这个过程进行了加盐。
代码如下:

//排序
param = objSort(param);

//json,然后生成签名
jsonStr = JSON.stringify(param).toString();
let sha1Str = CryptoJS.SHA1(salt+jsonStr).toString();
let md5Str = CryptoJS.MD5(sha1Str).toString();

最后将生成的sign值加入到请求参数中,

postman.setGlobalVariable("sign", md5Str); 

此处的sign是我们在请求的get参数中设置的一个变量,对postman变量不熟悉的话,自行百度吧。postman官网文档上说 request 这个对象是只读的,所以我们没办法自动添加一些请求参数,只能在预先请求的参数中设置好,然后通过变量修改这个参数的值。(另外,如何在一个collection中添加公共参数也没找到)

完整代码

完整代码如下,Pre-rquest Script 可以在三个地方起作用,按照优先级从高到低依次为:collection -> folder(文件夹)->单个request。单个请求的添加方法在上面第一张图的位置;右键collection选择edit,可以在collection上添加脚本;folder的添加方法跟collection一样。

let salt = "xxx";
let param = request.data;   //post 参数
let queryParam = pm.request.url.query.members;  //get中的参数

//将post和get合并,并且移除sign参数
for (let i in queryParam) {
    if (queryParam[i].key == "sign") {
        continue;
    }
    param[queryParam[i].key] = queryParam[i].value;
}
//时间戳参数
param.time = (new Date()).getTime().toString();
pm.environment.set("reqtime", param.time);

//排序
param = objSort(param);

//json,然后生成签名
jsonStr = JSON.stringify(param).toString();
let sha1Str = CryptoJS.SHA1(salt+jsonStr).toString();
let md5Str = CryptoJS.MD5(sha1Str).toString();

postman.setGlobalVariable("sign", md5Str);

//排序方法
function objSort(obj)
{
    let keys = Object.keys(obj).sort();
    let arr = {};
    for (let i in keys) {
        arr[keys[i]] = obj[keys[i]];
    }
    return arr;
}

你可能感兴趣的:(jQuery/Js)