使用 Postman 的 Pre-request Scripts 功能自动计算接口签名

现在大部分系统为了安全或者鉴权,都在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&timestamp=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)
}
启用位置

Snipaste_2020-08-05_17-05-53.jpg

Snipaste_2020-08-05_17-06-12.jpg

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇