Postman使用RSA加密字段及保存认证token
现有项目中认证使用OAuth2进行认证,为了安全密码用RSA加密,调试接口时需要先生成密码再调试,于是是否可以用Postman用RSA加密方式自动生成密码。研究发现Postman并没有自带RSA加密方式,现有的方案是使用第三方模块forge.js来实现加密,决定使用forge.js来实现RSA方式加密。
下载及安装forge.js
准备环境
安装git、nodejs,具体安装方法不在本方中赘述,不会可以问度娘。
下载forge.js
// github 下载
git clone https://github.com/digitalbazaar/forge.git
// gitee 下载
git clone https://gitee.com/mirrors_digitalbazaar/forge_1.git
安装forge.js
npm install
配置Postman
编写Pre-request Script脚本
想要加密Postman字段得需要用到Postman的Pre-request Script脚本编辑器,脚本如下。
//postman自带的加密函数是cryptoJS,无法满足;因此需要引用第三方库forge.js
//调用forge.js服务的地址:https://raw.githubusercontent.com/loveiset/RSAForPostman/master/forge.js打不开时,就用https://lzq1357.gitee.io/various/forge_min.js
const forge_url = "https://lzq1357.gitee.io/various/forge_min.js"
// 提取{{}}中内容
function getBracketStr(text) {
let result = ''
let regex = /{{(.+?)}}/g;
let options = text.match(regex);
if (options && options.length > 0) {
let option = options[0];
if (option) {
result = option.substring(2, option.length - 2)
}
}
return result
}
// RSA加密方法
function rsaEncrypt(content){
// RSA公钥密码保存在全局变量rsa_pub_key里
var public_key ='-----BEGIN PUBLIC KEY-----\n'+
pm.globals.get("rsa_pub_key") + '\n' +
'-----END PUBLIC KEY-----'
//公钥转化为pem格式
var publicKey = forge.pki.publicKeyFromPem(public_key)
//创建缓冲区,所需要加密内容设置编码格式
var buffer = forge.util.createBuffer(content, 'utf8')
//转化为字节
var bytes = buffer.getBytes()
//加密函数,把明文使用'RSAES-PKCS1-V1_5'加密成密文,并使用Base64编码输出
var encryptedText = forge.util.encode64(publicKey.encrypt(bytes,'RSAES-PKCS1-V1_5',{
md:forge.md.sha256.create(),
mgf1:{
md:forge.md.sha1.create()
}
}));
return encryptedText;
};
// ------------ AES 加密 ------------
function aesEncrypt(content){
const key = CryptoJS.enc.Utf8.parse(pm.globals.get("aes_key"));
const iv = CryptoJS.enc.Utf8.parse(pm.globals.get("aes_iv"));
const encrypted = CryptoJS.AES.encrypt(content, key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7});
return encrypted.toString();
}
//第一次运行时从网络加载forgeJS,会导致请求失败
if(!pm.globals.has('forgeJS')){
console.log('request forge.js from ' + forge_url)
pm.sendRequest(forge_url,function(err,res){
if(err){
console.error(err)
} else {
// console.info("request forge.js: Succeed,please try again")
pm.globals.set('forgeJS',res.text())
}
});
return;
};
//设置全局变量forgeJS
eval(pm.globals.get('forgeJS'))
// 获取当前请求中的加密变量 判断为字符串还是环境变量,环境变量一定是"{{}}" 格式
let requestData;
if((typeof request.data) === 'string'){
requestData = JSON.parse(request.data)
} else {
requestData = request.data;
}
// Object.assign 拷贝对象 将request.headers 中的所有数据,拷贝到 requestData中
requestData = Object.assign(requestData, request.headers);
// 遍历
Object.keys(requestData).map(key => {
// 内容
let value = requestData[key] + '';
// 是否为变量
if (value.indexOf('{{') !== -1) {
let content = getBracketStr(value);
// 判断用是否加密,并选择加密方式
if (content.indexOf('aes:') !== -1) {
let c = content.split('aes:')[1];
let encryptedContent = pm.environment.get(c); // 加密内容
encryptedContent = encryptedContent ? encryptedContent : c;
pm.environment.set(content, aesEncrypt(encryptedContent));
} else if (content.indexOf('rsa:') !== -1) {
let c = content.split('rsa:')[1];
let encryptedContent = pm.environment.get(c); // 加密内容
encryptedContent = encryptedContent ? encryptedContent : c;
pm.environment.set(content, rsaEncrypt(encryptedContent));
}
}
});
配置密码到全局变量
Pre-request Script脚本需要配置全局变量rsa_pub_key,aes_key,aes_iv具体配置如下图。
使用方法
需要加密的字段使用 {{aes:123456}} 或者 {{rsa:123456}} 来配置,aes或者rsa指加密方式,冒号后面是密码的明文。具体配置如下图所示。
保存OAuth2认证token信息
保存OAuth2认证token信息需要用到Postman和Tests脚本,如保存其 access_token、token_type、refresh_token等。
配置Tests脚本
var jsondata = JSON.parse(responseBody);
var access_token = jsondata.token_type + ' ' + jsondata.access_token;
var refresh_token = jsondata.token_type + ' ' + jsondata.refresh_token;
pm.globals.set("access_token", access_token);
pm.globals.set("refresh_token", refresh_token);
使用方法
如加密字段一样,通过 {{access_token}} 来使用。示例如下图所示。
至此,Postman使用RSA加密字段及保存认证token已经完成!!