接口自动化测试|Postman通用接口加密解决方案

前言: 很对小伙伴对于psotman接口加密不知道如何解决,这里给大家出了一个全网最详细的解决方案,希望能帮助到大家
接口自动化测试|Postman通用接口加密解决方案
文章图片

点我领取全套自动化测试资料

问题

  1. postman内置加密Api,但不支持RSA加解密码。如何用postman进入rsa加解密?
  2. postman中request对象属性皆为只读,如何把提交时的明文变为密文?
解决问题一
  • postman支持eval函数,我们只要将rsa代码存入环境变量中,在需要的时候调用eval函数就可以解决
解决问题二
  • postman在每次请求时都会先执行pre-request scripts 中的脚本,在此处我们可以通过request对象拿到
    此次请求的参数,但request中的参数只可读。
    所以我们只能通过环境变量去占位然后在去加密变量中的值,于是在请求时的内容就会变成加密的内容。
    针对postman对{{}}读取的方式,我们可以先在请求参数中将要加密的内容包裹进来,然后在动态创建此变量,
    并将变量的加密内容写入此环境变量中,最后在执行请求完毕后将此变量清除
例子 接口自动化测试|Postman通用接口加密解决方案
文章图片

AES加密参数
  1. 必需用{{}}将内容包起来,因为在进行请求后postman遇到{{}}时会从环境变量中读取,如果有该环境变量则会动态替换。
  2. $符号后面是我们要加密的内容,可以直接填写内容或写入环境变量的名称
    接口自动化测试|Postman通用接口加密解决方案
    文章图片

    动态生成的环境变量
    如果不想在环境变量夹中显示动态生成的环境变量可以将下方tests中的脚本加入到tests中
  3. 点我领取全套自动化测试资料
相关脚本
  • 注意:将脚本加入到collections中会更好
  • Pre-request Scripts
// ------ 通用方法 ------ // 提取{{}}中内容 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 ------ if(!pm.globals.has("forgeJS")){ pm.sendRequest("https://raw.githubusercontent.com/loveiset/RSAForPostman/master/forge.js", (err, res) => { if (!err) { pm.globals.set("forgeJS", res.text()) } })}eval(postman.getGlobalVariable("forgeJS")); // ------------ AES 加密 ------------ function aesEncrypt(content){ //console.log('AES: ' + content); const key = CryptoJS.enc.Utf8.parse("Y5MUIOM7BUWI7BQR"); const iv = CryptoJS.enc.Utf8.parse('S41AXIPFRFVJL73Z'); const encrypted = CryptoJS.AES.encrypt(content, key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7}); return encrypted.toString(); }// ------------ RSA 加密 ------------ function rsaEncrypt(content){ const pubKey = pm.environment.get("RSA_Public_Key"); if(pubKey){ const publicKey = forge.pki.publicKeyFromPem(pubKey); const encryptedText = forge.util.encode64( publicKey.encrypt(content, 'RSAES-PKCS1-V1_5', { md: forge.md.sha1.create(), mgf: forge.mgf.mgf1.create(forge.md.sha1.create()) })); return encryptedText; } }// ------ 存储所有未加密环境变量 ------ if(!pm.environment.has('localStore')){ pm.environment.set('localStore', '{}'); } let localStore = JSON.parse(pm.environment.get('localStore')); // 获取当前请求中的加密变量 let requestData; if((typeof request.data) === 'string'){ requestData = https://www.it610.com/article/JSON.parse(request.data) } else { requestData = request.data; }requestData = Object.assign(requestData, request.headers); Object.keys(requestData).map(key => { let value = https://www.it610.com/article/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)); localStore[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)); localStore[content] = rsaEncrypt(encryptedContent); } } }); pm.environment.set('localStore', JSON.stringify(localStore));

  • Tests scripts
// 还原变量 if(!pm.environment.has('localStore')){ pm.environment.set('localStore', '{}'); } let localStore = JSON.parse(pm.environment.get('localStore')); Object.keys(localStore).map(key => { pm.environment.unset(key) }); pm.environment.unset('localStore')

接口自动化测试|Postman通用接口加密解决方案
文章图片


【接口自动化测试|Postman通用接口加密解决方案】文章到这里就结束了,各位铁汁如果有什么觉得不对的可以发在评论区咱们来讨论哈,
听说关注我并三连的铁汁都已经升职加薪暴富了哦!!!!

    推荐阅读