前言:新公司初來乍到,後臺使用的是常見的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沒用到啊,爲什麼還要發,因爲不發過去的話,後臺的認證是使用這兩個參數作爲登錄的依據,如果不發送的話,會提示未登錄。
結尾
這篇文章到這裏就結束了,沒有看懂或者有問題的小夥伴可以評論區留言,我收到後會及時回覆,如果你們覺得這個文章還不錯的話,麻煩動動你們的小手,點贊,評論一下本文章,謝謝每一位觀看的小夥伴!