在构建安全的API接口时,使用签名(Sign)机制是验证请求来源和数据完整性的重要手段。签名通常要求客户端将请求参数、时间戳和密钥按照特定规则拼接后进行哈希运算(如MD5, SHA256)。对于个人站长和开发者来说,频繁手动计算签名非常耗时。ApiFox和Postman都提供了强大的“预请求脚本”(Pre-request Script)功能,允许我们在请求发送前自动生成这个动态签名。
本文将以Postman和ApiFox通用的JavaScript脚本环境为例,演示如何生成一个基于SHA256的动态签名。
步骤一:准备环境变量
首先,您需要在环境变量或全局变量中设置您的应用密钥(Secret Key)和应用ID(App ID)。这是生成签名的核心要素。
- 打开环境管理。
- 添加以下变量:
| 变量名 | 初始值 | 作用 |
|---|---|---|
| APP_ID | your_app_001 | 应用标识符 |
| SECRET_KEY | abcdefg1234567 | 共享密钥 |
步骤二:编写预请求脚本(Pre-request Script)
打开您需要自动签名处理的接口,切换到“Pre-request Script”标签页,输入以下JavaScript代码。这段代码将获取当前时间戳、App ID、密钥,按固定规则拼接字符串,并使用SHA256生成签名。
// 1. 定义签名所需的关键数据
const secretKey = pm.environment.get("SECRET_KEY");
const appId = pm.environment.get("APP_ID");
// 2. 生成当前请求的时间戳
// 注意:API通常要求时间戳是秒级或毫秒级的字符串
const timestamp = Math.floor(Date.now() / 1000).toString();
// 3. (可选) 获取请求体。如果您的签名规则包含请求体内容,则需要解析。
// 假设我们只对时间戳和AppID进行签名示例
// 4. 构建待签名字符串 (示例规则: 按字段名升序排列参数)
// 在本例中,我们简单地按固定格式拼接:appId={value}×tamp={value}&key={secret}
const stringToSign = **appId=${appId}×tamp=${timestamp}&key=${secretKey}**;
console.log("待签名字符串: " + stringToSign);
// 5. 计算签名 (使用Postman/ApiFox内置的pm.crypto.hash库进行SHA256计算)
// 许多API要求签名结果为大写,这里转换为大写。
const signature = pm.crypto.hash('sha256', stringToSign).digest('hex').toUpperCase();
// 6. 将生成的动态值设置到环境中,供请求使用
pm.environment.set("current_timestamp", timestamp);
pm.environment.set("dynamic_sign", signature);
console.log("生成的签名: " + signature);
步骤三:在请求中使用动态变量
完成脚本编写后,您需要在您的请求参数(URL Params, Request Body, 或 Headers)中引用第二步设置的动态变量:{{current_timestamp}} 和 {{dynamic_sign}}。
示例:使用Query Params
在您的请求URL参数列表中添加以下键值对:
| KEY | VALUE |
|---|---|
| appId | {{APP_ID}} |
| timestamp | {{current_timestamp}} |
| sign | {{dynamic_sign}} |
ApiFox用户注意事项
ApiFox与Postman的脚本环境高度兼容,上述代码可以直接在ApiFox的“前置操作”标签页中使用。ApiFox同样支持使用 pm.environment.get 和 pm.environment.set 来操作环境变量,使得签名过程在两个工具中保持一致性和高效率。
汤不热吧