赞
踩
1、点击添加->添加一个新的collection
2、在添加的collection中新建一个请求
3、点击右上角眼睛后,使用环境变量,可以使用环境变量(environment)也可以使用全局变量(global environment),我个人为了怕麻烦所以使用环境变量
4、设置环境名称,在varibles中输入要加密的变量的变量名(做替换用),后面两个实际value值为空,保存点击右下角update
Update后,可以在manage environments中查看已添加的环境变量,要确保添加成功
5、设置请求方法和url地址,内容及格式;加密处用环境变量中的变量名替代填入
6. 配置请求前脚本Pre-requests Script,(脚本语言为JavaScript)
具体内容为:使用CryptoJS这个库,“var”为JS语言新建变量的固定声明方式
①行:新建变量card,使用CryptoJS库,对待加密的原始字符串“1652423”进行编码
②行:新建变量base64,使用CryptoJS库,对编码后的字符串进行base64类型的加密
③行:设置一个环境变量名为:“cardNumber”,用来获取第②行base64加密后的值
(这个变量名需要与之前设置环境变量时的变量名相同)
7、点击send发送请求,在下面出现预期结果。请求中字段使用Base64加密成功
8、点击右上角的眼睛查看环境变量中的变化,先前空的value值的地方出现了被base64加密编码后的值。相当于请求参数被加密后跟随请求进行发送。
base64加密后的值可以使用环境变量接收也可以使用集合变量或者子集和变量接收
postman中并非所有请求内容都可进行base64加密后发送并获取正确的响应结果,具体加密的部分需要根据需求确认并且一致
Base64加密只能针对字符串进行操作,如果是其他格式,要先转化成字符串然后进行 处理
前置脚本
前置脚本是在接口之前先执行,通常用于做一些参数的处理
常见操作
a. 环境变量获取/修改(具体见下方举例,在前置请求脚本中将数据定义为环境变量,在Body中引用)
b. 全局变量获取/修改(没有举例)
c. 请求数据的处理(加密、逻辑处理等)(具体见下方举例,md5加密的参数,先在前置请求脚本中定义,然后再body中引用)
在集合Edit窗口中,也可编辑前置脚本
接口签名加密
测试场景实战(具体见下方举例)
接口加密规则 sign字段=md5(phoneNum+ optCode+ timestamp);
关键代码:
获取时间戳:new Date().getTime();
md5加密: var md5 = CryptoJS.MD5(“1234”).toString();
保存变量:pm.environment.set(“md5”, md5);
图:接口需求文档,需签名验证的post接口
以上接口我们可以看出来,sign是需要前3个参数值并进行md5加密的,而且这个加密过程应该在请求前进行,
类似这种需求可以通过 前置请求脚本的方式实现,见下方举例;【此处有一点难理解,需要自行理解清楚】
图:postman设置前置请求脚本
图:postman Body设置
图:postman运行结果
要实现AES+Base64加密,我们需要用到Postman中的Pre-request Script。Pre-request Script是指在发送报文前执行的脚本,用于对请求包中的各种参数做一些个性化的处理。
脚本内容:
- var aesKey = "***";
- if('POST' == request.method && 'product' == pm.environment.get("env")) {
- const echoPostRequest = {
- url: request.url
- method: 'POST',
- header:'Content-Type:application/json',
- body: encrypt(request.data, aesKey)
- };
- pm.sendRequest(echoPostRequest, function (err, res) {
- console.log("request body -> " + echoPostRequest.body);
- console.log("response body -> " + res.text());
- var result = decrypt(res.text(), aesKey);
- console.log("response body decrypted -> " + result);
- });
- }
-
- // AES 加密方法
- // word是加密内容,keyStr是秘钥
- // ECB:加密算法,padding:对齐方式
- // ciphertext:16进制加密,不加此方法就是Base64加密
- function encrypt(word, keyStr){
- var key = CryptoJS.enc.Utf8.parse(keyStr);
- var srcs = CryptoJS.enc.Utf8.parse(word);
- console.log('content:'+word);
- var encrypted = CryptoJS.AES.encrypt(srcs, key, {mode:CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7});
- return encrypted.toString();
- }
-
- //解密
- function decrypt(word, keyStr){
- //console.log('decrypt key:' + keyStr);
- var key = CryptoJS.enc.Utf8.parse(keyStr);
- let base64 = CryptoJS.enc.Base64.parse(word);
- let src = CryptoJS.enc.Base64.stringify(base64);
- var decrypt = CryptoJS.AES.decrypt(src, key, {mode:CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7});
- return decrypt.toString(CryptoJS.enc.Utf8);
- }
上面的脚本,判断是否是现网环境product且是post请求,如果是,就对报文进行AES+Base64加密。在脚本里基于明文的请求包构造了一个加密请求,然后请求后台后打印出相应的返回包,并对返回包做一次解密拿到明文并输出。
除了Pre-request Script中的请求外,Postman还会继续发送明文的请求,所以相当于点击执行后发送了两次请求,这是需要关注的点。目前还没有想到其他合适的方法,如果有人知道怎么只发送一次请求,而且请求能重复执行,麻烦回复告知下,多谢。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。