使用场景
大多数项目都有登陆权限认证,需要先登录获取token再用这个token作为请求头请求接口。每次测试接口都需要先调登录接口,再给每个请求设置请求头。有点麻烦,根据这个配置完成之后每次只需要先调一下登录接口,其它接口就直接请求就行了,不需要再管请求头。有没有hin方便!
实现步骤
1. 登录接口
登录接口采用MD5+RSA加密
- 先将系统用户名及密码配置在postman环境变量中
-
调用接口获取公钥,并在该接口tests里面设置将本次公钥放进postman环境变量中
pm.test("Status code is 200", function () { pm.response.to.have.status(200);}); var data = JSON.parse(responseBody); pm.environment.set("publickKey", data); -
调用登录接口,调用之前先用MD5+RSA将用户名、密码用刚才获取到的公钥进行加密
MD5加密是postman内置的js,引入内部包只需要require(模块名)就ok啦!
var cryptos = require('crypto-js'); 像这样!
but!
RSA加密需要引用外部js,引用外部js的原理就是先获取这个js整个文本内容,然后eval(js文本)就可以在后续代码里直接调用这个js里面的方法啦!
这里我采用的先获取到js然后复制到postman的global变量里
然后在登录接口的pre-request-script里面直接调用
var cryptos = require('crypto-js'); //引入postman内置包
var username = pm.environment.get("username")//环境变量中配置的用户名
username = cryptos.MD5(username);
var password = pm.environment.get("password")//环境变量中配置的密码
password = cryptos.MD5(password);
//获取公钥
var encrypt_key = pm.environment.get("publicKey");//第一个步骤中保存到环境中的公钥
eval(pm.globals.get("forgeJs")); //将forgeJS的内容当js代码执行
var encUsername = encryptRsa(encrypt_key, username);//用户名RSA加密
var encPwd = encryptRsa(encrypt_key, password);//密码RSA加密
pm.variables.set("username", JSON.stringify(encUsername));//设置成本次请求的参数
pm.variables.set("password", JSON.stringify(encPwd));
pm.variables.set("publicKey", JSON.stringify(encrypt_key));
function encryptRsa(encrypt_key, clearText){
//注意此处上下的BEGIN PRIVATE KEY不要删除,框架自带的
const public_key = '-----BEGIN PUBLIC KEY-----\n'
+ encrypt_key
+ '\n-----END PUBLIC KEY-----';
var publicKey = forge.pki.publicKeyFromPem(public_key);
var buffer = forge.util.createBuffer(clearText, 'utf8');
var bytes = buffer.getBytes();
var encryptedText = forge.util.encode64( publicKey.encrypt(bytes, 'RSAES-PKCS1-V1_5', {
md: forge.md.sha256.create(),
mgf1: {
md: forge.md.sha1.create()
}
})
);
console.log('encryptedText: '+ encryptedText);
return encryptedText;
};
接口参数示例
tests是在获取到响应之后执行的,登录完成之后将获取到的token放进postman环境变量中
pm.test("Status code is 200", function () { pm.response.to.have.status(200);}); var data = JSON.parse(responseBody); pm.environment.set("token", data);
2、整个collection添加pre-request-script
pm.request.headers.add({ key: "token", value: pm.environment.get("token") });