Postman中使用变量计算请求体HMAC时认证失败的问题
解决Postman中HMAC认证因内置动态变量重复替换导致的验证失败问题
问题场景
- 使用Postman构建HMAC签名认证请求时,静态请求体可正常通过服务端签名验证
- 当请求体中使用
$randomInt这类内置动态变量时,预请求脚本通过replaceSubstitutions()获取的渲染请求体,和实际发送到服务端的请求体不一致,导致HMAC签名验证失败,返回401 - 若将脚本日志输出的渲染体复制为静态请求体,请求可正常返回200
根因分析
内置动态变量(如$randomInt、$timestamp、$guid)的特性是每次调用都会生成全新值:
- 预请求脚本中调用
pm.variables.replaceIn()或replaceSubstitutions()时,会触发一次动态变量值生成 - 实际发送请求时,Postman会再次对请求体中的动态变量进行替换,生成新值
两次生成的值不一致,导致脚本计算HMAC签名用的请求体,和实际发送的请求体不匹配,无法通过服务端校验
解决方案
核心思路是让动态变量仅生成一次,脚本与实际请求复用同一值:
- 在预请求脚本中提前生成动态变量的固定值,存入自定义变量(环境/全局/集合变量均可)
- 将请求体中的内置动态变量替换为自定义变量
- 基于自定义变量渲染后的请求体计算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
相关产品推荐
相关产品推荐

