如何在 JMeter 中签署请求?

how to sign request in JMeter?

对于个人调用,我有一个类似 ruby 的代码来生成 API 请求:

api_key = 'some-key-here'
shared_secret = 'very-secretive-secret'

timestamp = Time.now.to_i.to_s
sig = Digest::MD5.hexdigest( api_key+shared_secret+timestamp )

request_url = "#{production_point}/#{request}?apikey=#{api_key}&sig=#{sig}&format=json"
puts request_url

但是生成的 request_url 只能在相对较短的时间内工作,具体取决于当前时间戳。

现在我需要做一些性能测试,在 JMeter 中,我曾经使用一个包含 URL/requests/keywords 列表的文件,我需要用它来破坏服务器,但那些是 – 静态 URLs。现在我需要测试一个服务,它要求每个请求都按照上述方式进行签名,我不能只使用一个列表。

我知道 JMeter 中有一个 md5 函数。但是我把 api_key 和 shared_secret 放在哪里(秘密本身不是 URL 的一部分)。

有人可以指导我为需要使用需要时间戳的 md5 ed 签名签署每个请求的服务设置 JMeter 测试吗?

您可以使用 "Beanshell" 测试元素之一,即 Beanshell PreProcessor 以便在请求之前生成正确的签名值。

  1. 将 Beanshell 预处理器添加为 HTTP 请求的子项,该请求执行 API 调用
  2. 将以下代码放入 PreProcessor 的 "Script" 区域(它基本上相当于您的 Ruby 脚本的 Beanshell)

    import org.apache.commons.codec.digest.DigestUtils;
    
    String api_key = "some-key-here";
    String shared_secret = "very-secretive-secret";
    long timestamp = System.currentTimeMillis()/1000;
    
    String sig = DigestUtils.md5Hex(api_key + shared_secret + timestamp);
    
    vars.put("sig", sig);
    
    log.info("Signature: " + sig);
    
  3. 在需要时将生成的签名值引用为 ${sig},因为它已存储在 JMeter Variable 中。

演示:

参考文献: