如何在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
相关产品推荐
相关产品推荐

