现在大部分系统为了安全或者鉴权,都在Api接口中加入了签名,签名的生成规则大同小异,无非是参数排序加入约定的AppID什么的加密后生成,时间戳可有可无。开发测试时会比较麻烦,早先都是做一个命令行工具,或者直接先将中间件关掉,最近了解到
Postman本身内置了一项Pre-request Scripts功能,我们基于它实现自动计算接口签名的功能。
先看签名生成步骤
签名步骤:
第1步,获取请求的数据并且按照字典顺排序
第2步,按字典顺序排序,
第3步,构建参数字符串key1=val1&key2=val2
第3步,使用app_secret进行签名生成signature
给定的Python生成方法
#1.请求数据 并且排序
param= {
"app_id": "HRisVpDyTIsssKQ",
"timestamp": '1596529247822',
"name": "123456",
"id": "444555666",
}
ksort_params = dict(sorted(param.items(), key=operator.itemgetter(0)))
#{'app_id': 'HRisVpDyTIsssKQ', 'id': '444555666', 'name': '123456', 'timestamp': '1596529247822'}
#2.build_query
param_str = ''
for key, val in ksort_params.items():
param_str += "%s=%s&" %(key,val)
param_str = param_str[:-1]
#app_id=HRisVpDyTIsssKQ&id=444555666&name=123456×tamp=1596529247822
#3.签名
data = {
'signature':sha256Hmac( app_secret , param_str),
'param': json.dumps(param)
}
'''
{
'signature': b'2pYbCKugfAYs/iMVxy60cUmUPB3gWE+DbKyN076uKW4=',
'param': '{"app_id": "HRisVpDyTIsssKQ", "timestamp": "1596529247822", "name": "123456", "id": "444555666"}'}
'''
def sha256Hmac(secret,message):
message = bytes(message, 'utf-8')
secret = bytes(secret, 'utf-8')
hash = hmac.new(secret, message, hashlib.sha256)
return base64.b64encode(hash.digest())
再看下后台Php的生成方法
protected function getSignature($content_arr,$secret){
ksort($content_arr);
$content_str = '';
foreach($content_arr as $k=>$v){
$content_str .= $k."=".$v."&";
}
$content_str = trim($content_str,"&");
return base64_encode ( hash_hmac("sha256",$content_str , $secret,TRUE) );
}
最终实现的方法
var CryptoJS = require('crypto-js')
// 设置timestamp
var timestamp = new Date().getTime();
pm.collectionVariables.set('timestamp', timestamp);
// 生成signature
var app_id = 'HRi8VpDyTI6YjhKQ';
var app_secret = 'HRi8VpDyTI6YjhKQvsXWbCJrRmMBpt97';
pm.collectionVariables.set('app_id', app_id);
var param = filterByKey(pm.request.body.formdata, 'param')[0].value
if (param) {
// 动态变量替换
param = param.replace("{{app_id}}", pm.collectionVariables.get('app_id'));
param = param.replace("{{timestamp}}", pm.collectionVariables.get('timestamp'));
let json = JSON.parse(param)
var keyValue = []
// 第1步,获取请求的数据并且按照字典顺排序
for (var key in json) {
keyValue.push(key + '=' + json[key]);
}
// 第2步,按字典顺序排序,
keyValue.sort();
// 第3步,构建参数字符串key1=val1&key2=val2
var sign = keyValue.join('&');
// 第4步,使用app_secret进行签名生成signature
sign = CryptoJS.HmacSHA256(sign, app_secret).toString(CryptoJS.enc.Base64);
pm.collectionVariables.set("sign", sign);
}
// 根据key筛选
function filterByKey(aim, key) {
return aim.filter(item =>item.key == key)
}
启用位置

