基于前置脚本的动态Headers实践-以1panel api和apifox为例

7 13~17 分钟

众所周知,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按理说也是可以的,但我没测试。