Postman 可以在 Pre-request Script 中使用 JavaScript 的 Date.now() 获取时间戳,并结合内置的 CryptoJS 库计算签名,最后通过 pm.request.headers.add 将结果写入请求头。
先说结论:利用 Postman sandbox 环境内置的 CryptoJS 库和 Date 对象即可实现动态签名,无需安装外部插件。
- 适合需要接口防重放或身份验证的 API 调试场景。
- 先看服务端要求的签名算法(如 HMAC-SHA256)和时间戳单位(毫秒或秒)。
- 建议先在 Console 面板打印变量,确认生成值符合预期再发送请求。
脚本速用版
var timestamp = Date.now();
var secret = pm.variables.get("api_secret");
var stringToSign = timestamp + secret;
var signature = CryptoJS.HmacSHA256(stringToSign, secret).toString();
pm.request.headers.add({key: "X-Timestamp", value: timestamp});
pm.request.headers.add({key: "X-Signature", value: signature});
console.log("Timestamp:", timestamp, "Signature:", signature);为什么会这样
Pre-request Script 在请求发送前执行,允许动态修改请求参数和头信息。Postman 沙箱环境内置了 CryptoJS 库,支持常见的哈希和加密算法,可以直接调用而不需引入外部脚本。
分步处理
1. 打开 Postman 请求页面的 Pre-request Script 标签页。
2. 获取时间戳:使用 var timestamp = Date.now() 获取毫秒级时间戳,若服务端要求秒级,需除以 1000 并取整。
3. 获取密钥:通过 pm.variables.get("api_secret") 从环境变量或集合变量中读取密钥,避免硬编码在脚本中。
4. 计算签名:使用 CryptoJS.HmacSHA256 方法,将时间戳与密钥拼接后进行哈希计算。
5. 写入请求头:使用 pm.request.headers.add 方法将时间戳和签名添加到请求头,键名需与服务端接口文档一致。
怎么验证是否生效
1. 点击 Postman 底部的 Console 按钮(或快捷键 Ctrl+Alt+C),查看脚本中 console.log 输出的时间戳和签名值。
2. 在发送请求前,点击请求标签页的 Code 图标或查看 Request Preview,确认 Headers 中已包含 X-Timestamp 和 X-Signature 字段。
3. 发送请求后,观察服务端响应状态码,若签名为 200 OK 则验证通过,若为 401 或 403 则检查签名算法细节。
常见坑
1. 时间戳单位不一致:服务端可能要求秒级时间戳,而 Date.now() 返回毫秒,需手动转换。
2. 密钥存储不安全:不要将密钥硬编码在脚本中,应使用 Collection Variables 或 Environment Variables 存储。
3. 字符编码问题:签名源字符串的拼接顺序和编码格式(UTF-8)需与服务端严格一致,否则哈希值不同。
常见问题
CryptoJS 报错找不到怎么办
Postman 沙箱环境默认内置 CryptoJS,无需安装,若报错请检查拼写是否为 CryptoJS 而非 crypto。
如何在不同环境切换密钥
在 Environment 中设置不同的 api_secret 变量,发送请求前切换对应的环境即可自动引用不同密钥。
时间戳签名有时效性吗
有,服务端通常验证时间戳与当前时间的差值,若本地时间与服务器时间偏差过大会导致签名失效。
参考来源
Postman Learning Center - Scripting Reference, "Introduction to scripts", https://learning.postman.com/docs/sending-requests/scripts/intro-to-scripts/