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沒用到啊,爲什麼還要發,因爲不發過去的話,後臺的認證是使用這兩個參數作爲登錄的依據,如果不發送的話,會提示未登錄。

結尾

這篇文章到這裏就結束了,沒有看懂或者有問題的小夥伴可以評論區留言,我收到後會及時回覆,如果你們覺得這個文章還不錯的話,麻煩動動你們的小手,點贊,評論一下本文章,謝謝每一位觀看的小夥伴!

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