PostMan高级用法,接口MD5+Secret签名Sign

前言:新公司初来乍到,后台使用的是常见的appId+secret用md5加签方式验证接口数据完整性,苦于经理给的一个main方法去测试,每次弄都感觉很麻烦,最近开了postman的高级用法,测试成功觉得还是不错的,在这分享一下

首先说明,Tests是在接口响应后执行的脚本,而Pre-Request-Script是在接口请求前执行的脚本,这点注意。

然后进入postman,点击右上角这个按钮,可以查看当前的global变量,也就是全局变量,点击这个小眼睛可以看到当前已保存的全局变量。

点击Globals

这里可以原先设置一些全局的baseUrl、appId、secret等变量,以备后边直接拿来使用。

接下来开始正题:

登录

我们这里的登录接口需要一个account账号+password密码,然后我要做的是,把登录返回的cflag和jwttoken存入postman本地的全局变量中,然后其他接口需要用到这两个参数+当前时间戳和后端定义的secret通过MD5加签大写通过header传给后端进行加密验证,前边说到,Tests是方法执行之后触发的内容,然后我要获取到Cookie里的内容,下边是代码:

我用文字提示的那两个方法,大家点击左边就会出现对应的js代码。

因为postman内置了一个node.js库,所以几乎所有的js语法都支持,先别着急运行代码,点击左上角View→Show Postman Console可以弹出log窗口进行调试代码

代码:

var cookies = pm.request.headers.get("Cookie");//从返回值的拿到所有cookie
console.log("从返回cookie拿到:"+cookies);
var cookiesArr = cookies.split(";");//通过分号分隔为数组
console.log("分隔成数组:"+cookiesArr);
for(var i in cookiesArr){
    let index = cookiesArr[i].indexOf("=");//通过=等号将键值对分开
    let key = cookiesArr[i].substring(0,index);
    let value = cookiesArr[i].substring(index+1,cookiesArr[i].length);
    console.log("出现的下标:"+index+",key:"+key+",value"+value);
    pm.globals.set(key,value);//存入全局变量
}

然后运行:

图中红色框框分别代表我打印的console日志,具体格式大家可以看到,最后结果所有的cookie都根据key value存入了全局变量。

接下来是如何动态获取存入的全局变量,对接口进行加签。

调用

这里以意见反馈接口举例,说明写在图片里边,大家可以看下,代码我贴在图片下边

//var arr = pm.request.body.formdata;//获取传入的所有参数键值对数组
var arr = pm.request.body.urlencoded;
console.log("获取所有输入参数的一个数组:"+arr);
if(null!==arr){
    var secret = pm.globals.get("secret");
    var formData = arr.toString();
    var sign = getSign(formData,secret);
    pm.globals.set("sign", sign);
    pm.globals.set("time",Math.round(new Date()));
}
//md5 CryptoJS.MD5(str).toString().toUpperCase()



function S4() {
    return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);
}

/**
 *生成32位UUID 
 **/ 
function generateUUID() {
    return (S4() + S4() + S4() + S4() + S4() + S4() + S4() + S4());
}
/**
 * 签名方法
 **/
function getSign(params, kAppSecret) {
    let content;
    if (typeof params == "string") {
        content = params
    } else if (typeof params == "object") {
        var arr = [];
        for (var i in params) {
            arr.push(i + "=" + params[i]);
        }
        content = arr.join("&")
    }
    var urlStr = content.split("&").sort().join("&");
    var newUrl = urlStr + "&key=" + kAppSecret;
    console.log(newUrl);
    let sign = CryptoJS.MD5(newUrl).toString().toUpperCase();
    return sign.toUpperCase();
}

这是我的参数,由于是意见反馈,所以只有一个参数。

请求头:

这里的jwttoken和cflag是登录成功后在tests中存入的,sign和time是刚刚在pre的接口请求前会存入,appId是一开始手动设置进去的全局变量,这个是和后端对应的,强调一下,这种方式只是我们公司的接口签名方式,你们在使用的时候要按照自己的方式来;同时这里我还发现了一个小bug,我在第一步登录的时候存入的jwttoken和cflg使用{{}}获取的时候必须在前边加一个空格,不然就提示undefind,也就是{{ jwttoken}} {{cflag}}这个令我很郁闷,不知道为啥

后端验证签名的策略也是一样的

点击发送请求,看控制台打印

后端也能拿到这写数据,后端自己在后台使用同样的逻辑,拿到appId和后台存的secret带着参数进行md5验证然后对比sign是否一致即可验证参数值完整性,这里有人问我的jwttoken和cflg没用到啊,为什么还要发,因为不发过去的话,后台的认证是使用这两个参数作为登录的依据,如果不发送的话,会提示未登录。

结尾

这篇文章到这里就结束了,没有看懂或者有问题的小伙伴可以评论区留言,我收到后会及时回复,如果你们觉得这个文章还不错的话,麻烦动动你们的小手,点赞,评论一下本文章,谢谢每一位观看的小伙伴!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章