Postman 怎么在 Pre-request Script 中动态生成时间戳签名

文章导读
Postman 可以在 Pre-request Script 中使用 JavaScript 的 Date.now() 获取时间戳,并结合内置的 CryptoJS 库计算签名,最后通过 pm.request.headers.add 将结果写入请求头。
📋 目录
  1. 脚本速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 常见问题
  7. 参考来源
A A

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 字段。

Postman 怎么在 Pre-request Script 中动态生成时间戳签名

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/