Postman高级应用(5):再也不用注释签名代码了——自动生成签名

场景

我们在写服务端接口时候,往往需要考虑安全问题,最基本的一点就是接口需要按照约定的规则进行签名校验。一旦接口校验签名,就意味着我们用Postman不能想以前那样顺利的测试了,服务端必定会返回签名失败。我们在本地开发时候,一定有不少开发同学是通过注释掉验签代码来绕开签名,但往往提交代码时候又不小心提交上去。灵活点的签名校验可能会忽略掉来自本机请求的验签,我们这里假设系统设计的没这么灵活,而且即使这样灵活设计也还是解决不了外网要测试dev qa环境的接口无法通过验签的问题。下面我们就利用Postman强大的Pre-request Script功能来实现自动为每个请求生成服务端需要的签名参数。

Pre-request Script

在开始编写案例之前,先简单介绍一下Postman的Pre-request Script到底是个什么东西?从字面意思能猜测出这是一个在请求之前会执行的脚本,我们看下官方给出的流程图,就可以证明我们的猜想。

Pre-request Script是通过Postman的沙盒(Sandbox)来实现的,而Sandbox是一个JavaScript执行环境,里面内置了一部分常用的JS库和函数(下面会介绍到)。所以我们其实是通过编写JavaScript代码,代码在请求发出前先被执行,从而达到自动生成签名的目的。

实战

先切换到Pre-request Script选项卡,开始编写JavaScript代码。

假设服务端的签名算法如下:所有请求参数都放在Body里以json格式提交,里面必须包含一个当前时间戳ts以及签名后得到的sign。对body中除了sign以外的所有字段签名(暂时不考虑json有数组的情况),先按照key升序排列,然后以key=value的形式用&拼接字符串,最后用签名密钥signKey对拼接后的字符串进行SHA1签名得到sign。我们直接贴代码吧。

(function () {
    var data = JSON.parse(request.data);
    var signKey = pm.environment.get('signKey');
    var sign = calcSign(data, signKey);
    pm.globals.set('sign', sign);
})();

function calcSign(data, signKey) {
	delete data['sign'];

	var keys = [];
	for(var k in data) {
	    keys.push(k);
	}
    keys.sort();
    
    var kv = [];
    for (var v of keys) {
        kv.push(v + '=' + data[v]);
    }
    var kvStr = kv.join('&');

    var sign =  CryptoJS.HmacSHA1(kvStr, signKey).toString();
    return sign;
}

我们还需要在请求的Body里加上tssign字段,而且必须用双引号括起来,否则会报错。还要在环境变量或全局变量(视情况而定)里设置signKey字段,如图所示。

代码中使用到了Postman Sandbox的一些常用的内置函数,这里简单介绍一下。Sandbox内置的类库以及完整的Postman API介绍请看最下面的文档,这里无法一一罗列和演示。

  • (function(){ ... })():jQuery的写法,Sandbox内置了jQuery库。
  • pm.environment.get(variableName):获取某个环境变量的值,也可以写成 postman.getEnvironmentVariable(variableName)。
  • pm.globals.set(variableName, variableValue):设置某个全局变量,也可以写成 postman.setGlobalVariable(variableName, variableValue)。
  • CryptoJS.HmacSHA1():内置的CryptoJS库,几乎涵盖所有加密算法,本案例使用了SHA1,大家根据具体签名规则来选择。
  • {{$timestamp}}:动态返回当前时间戳。类似的语法还有{{$guid}}生成唯一ID,{{$randomInt}}生成0到1000的随机整数。

如果每个请求都要加签名,不必为每个请求都写一份重复的Pre-request Script代码。可以在收藏或者文件夹级别统一设置,这样该收藏或文件夹下每一个请求都能执行到。

以上只是Pre-request Script的一个常见的应用场景,它的用途非常之广,等待你去探索!

API文档

更多内容请阅读《Postman高级应用》专栏

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