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

如何在JMeter中正确配置Hawk authentication认证

JMeter配置Hawk Authentication认证正确方法

直接在HTTP Header Manager中明文传递Hawk Auth ID、Hawk Auth Key、Algorithm参数返回未授权,核心原因是Hawk协议并非靠明文传递这三个参数完成校验,服务端需要的是基于三个参数+请求上下文(时间戳、请求方法、请求路径、随机nonce等)按Hawk规则计算生成的签名Authorization头,直接传递原始参数完全不符合协议规范。

方法1:JSR223预处理程序实现(无需额外插件,兼容性最高)

  • 在线程组层级新增「用户自定义变量」,提前存储固定认证参数:
    • hawk_id:填入实际的Hawk Auth ID值
    • hawk_key:填入实际的Hawk Auth Key值
    • hawk_algorithm:填入和服务端约定的签名算法,常见值为sha256、sha1
  • 在需要鉴权的HTTP请求下新增JSR223 PreProcessor,语言选择Groovy(Groovy性能远高于BeanShell,不推荐用其他脚本语言)
  • 在预处理程序中粘贴如下签名生成脚本,脚本会自动读取当前请求上下文生成符合规范的签名头:
import javax.crypto.Mac
import javax.crypto.spec.SecretKeySpec
import org.apache.commons.codec.binary.Base64
import java.security.SecureRandom

// 读取预存的认证配置
def hawkId = vars.get("hawk_id")
def hawkKey = vars.get("hawk_key")
def algorithm = vars.get("hawk_algorithm")
// 拉取当前请求的上下文信息
def reqMethod = sampler.getMethod()
def reqPath = sampler.getUrl().getPath()
def reqHost = sampler.getUrl().getHost()
def reqPort = sampler.getUrl().getPort()
// 生成秒级时间戳、随机nonce串
def timestamp = (System.currentTimeMillis() / 1000).intValue().toString()
def nonce = new BigInteger(130, new SecureRandom()).toString(32)

// 构造Hawk规范要求的待签名字符串,换行、字段顺序必须严格匹配协议要求
def normalisedString = """hawk.1.header
${timestamp}
${nonce}
${reqMethod}
${reqPath}
${reqHost}
${reqPort}

"""
// 计算HMAC签名
def macAlgorithm = "Hmac${algorithm.toUpperCase().replace('-','')}"
Mac mac = Mac.getInstance(macAlgorithm)
SecretKeySpec signingKey = new SecretKeySpec(hawkKey.getBytes("UTF-8"), macAlgorithm)
mac.init(signingKey)
def macBytes = mac.doFinal(normalisedString.getBytes("UTF-8"))
def macBase64 = new String(Base64.encodeBase64(macBytes))

// 拼接为标准Hawk Authorization头,存入变量供后续调用
def authHeader = """Hawk id="${hawkId}", ts="${timestamp}", nonce="${nonce}", mac="${macBase64}" """
vars.put("hawk_auth_header", authHeader)
  • 给对应HTTP请求新增HTTP Header Manager,新增一条头配置:名称填Authorization,值填${hawk_auth_header}即可
  • 如果服务端要求校验payload哈希、携带ext扩展字段、app参数,需要对应修改规范化字符串的拼接逻辑,追加对应字段后再计算签名,否则会出现签名不匹配。

方法2:通过专用插件快速配置(无需手写脚本)

  • 打开JMeter Plugins Manager,搜索安装Hawk Authentication Support插件,重启JMeter生效
  • 在需要鉴权的HTTP请求下新增Hawk Authorization配置元件
  • 在配置页直接填入三个核心参数:
    • Hawk Auth ID:对应你的认证ID
    • Hawk Auth Key:对应你的认证密钥
    • Algorithm:下拉选择和服务端一致的签名算法
  • 插件会自动在请求发送前完成签名计算、注入Authorization头,配置完成即可直接发起请求。

常见鉴权失败排查点

  • 确认JMeter运行主机和服务端的时间差不超过60秒,Hawk默认会校验时间戳有效性,时间差过大会直接返回未授权
  • 确认签名算法完全匹配,服务端用SHA-256时不能配置为SHA1
  • 如果请求经过反向代理、URL重写,要确认签名计算时用的请求路径、host、端口和服务端实际接收到的值完全一致,字段不匹配会导致签名校验失败
  • 不要手动在Header Manager中传递自定义的hawk id、hawk key头,服务端不会识别这类非标准头,只会读取标准Authorization头中的Hawk签名内容。

内容的提问来源于stack exchange,提问作者Pratik Dey

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 07:06:25