基于前置脚本的动态Headers实践-以1panel api和apifox为例
众所周知,1panel是一款非常好用的服务器管理平台,更好用的是它竟然开放了api,这样我们就能通过api对服务器进行各种操作:比如文件的上传下载,docker管理,网站创建,数据库管理等等。鉴于目前官网只有go语言代码的示例,我这边通过apifox(postman也是可以的),来实现一个前置脚本来进行api接口的鉴权,这样方便进行可行性测试。
首先我们需要开启api接口的功能,这个默认是关闭的,需要在面板设置里面开启。
设置IP白名单和有效期,为了方便测试,可以设置为0.0.0.0和0,表示不限制IP和有效期为永久。
然后我们打开API接口文档swagger的json,把它下到本地保存。访问地址一般是[ip]:[port]/1panel/swagger/doc.json
在apifox中导入
这样我们的接口就顺利导入进来了
这一步需要配置前置脚本,这里我写好,直接替换里面的密钥就行了,密钥就是刚才开启api功能那一步页面上显示的随机值,需要在接口的前置操作里面添加一个公共脚本。
// 引入内置的 CryptoJS 库用于 MD5 加密 const CryptoJS = require('crypto-js'); // 1. 获取当前的 Unix 时间戳 (秒) // Math.floor(new Date().getTime() / 1000) 会得到一个数字,需要转换为字符串 const timestamp = Math.floor(new Date().getTime() / 1000).toString(); // 2. 设置你的面板 API 密钥 // 请将这里的密钥替换成你自己的 const systemKey = "00000000000000000000000000000"; // 3. 按照 Go 代码中的逻辑拼接字符串 // "1panel" + systemKey + panelTimestamp const stringToSign = "1panel" + systemKey + timestamp; // 4. 计算拼接后字符串的 MD5 哈希值 const token = CryptoJS.MD5(stringToSign).toString(); // 5. 将生成的时间戳和令牌添加到当前请求的 Headers 中 // 如果 Header 已存在,此操作会更新它的值 pm.request.headers.upsert({ key: '1Panel-Timestamp', value: timestamp, description: 'Generated by pre-request script' }); pm.request.headers.upsert({ key: '1Panel-Token', value: token, description: 'Generated by pre-request script' }); // (可选) 在控制台输出生成的值,方便调试 console.log("1Panel-Timestamp:", timestamp); console.log("1Panel-Token:", token);
最后再右上角环境里面配上正确的地址,就可以成功访问动态加密的api了。
PS:最后再说一下,pm本来就是postman的,所以postman按理说也是可以的,但我没测试。