You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Postman中使用变量计算请求体HMAC时认证失败的问题

解决Postman中HMAC认证因内置动态变量重复替换导致的验证失败问题

问题场景

  • 使用Postman构建HMAC签名认证请求时,静态请求体可正常通过服务端签名验证
  • 当请求体中使用$randomInt这类内置动态变量时,预请求脚本通过replaceSubstitutions()获取的渲染请求体,和实际发送到服务端的请求体不一致,导致HMAC签名验证失败,返回401
  • 若将脚本日志输出的渲染体复制为静态请求体,请求可正常返回200

根因分析

内置动态变量(如$randomInt、$timestamp、$guid)的特性是每次调用都会生成全新值:

  1. 预请求脚本中调用pm.variables.replaceIn()或replaceSubstitutions()时,会触发一次动态变量值生成
  2. 实际发送请求时,Postman会再次对请求体中的动态变量进行替换,生成新值
    两次生成的值不一致,导致脚本计算HMAC签名用的请求体,和实际发送的请求体不匹配,无法通过服务端校验

解决方案

核心思路是让动态变量仅生成一次,脚本与实际请求复用同一值:

  1. 在预请求脚本中提前生成动态变量的固定值,存入自定义变量(环境/全局/集合变量均可)
  2. 将请求体中的内置动态变量替换为自定义变量
  3. 基于自定义变量渲染后的请求体计算HMAC签名,确保与实际发送的请求体完全一致

代码示例

预请求脚本

// 1. 生成固定动态值并存储为自定义变量
const fixedRandomInt = pm.variables.replaceIn('{{$randomInt}}');
pm.variables.set('custom_random_int', fixedRandomInt);

// 2. 渲染请求体(使用自定义变量的固定值)
const rawBody = pm.request.body.raw;
const renderedBody = pm.variables.replaceIn(rawBody);

// 3. 计算HMAC签名(以SHA256为例,可根据实际需求调整算法)
const hmacSecret = pm.environment.get('HMAC_SECRET');
const signature = CryptoJS.HmacSHA256(renderedBody, hmacSecret).toString(CryptoJS.enc.Hex);

// 4. 将签名添加到请求头
pm.request.headers.add({ key: 'X-HMAC-Signature', value: signature });

请求体调整

将原来的{{$randomInt}}替换为自定义变量{{custom_random_int}},示例请求体:

{
  "id": "{{custom_random_int}}",
  "name": "test"
}

内容的提问来源于stack exchange,提问作者T Nguyen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 08:40:49