【问题标题】:how to sign request in JMeter?如何在 JMeter 中签署请求?
【发布时间】:2016-06-07 18:35:14
【问题描述】:

对于个人调用,我有一个类似的 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/请求/关键字列表的文件,我需要使用这些文件来攻击服务器,但这些都是静态 URL。现在我需要测试一个服务,它要求每个请求都以上述方式进行签名,我不能只使用一个列表。

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

请有人指导我为需要使用需要时间戳的 md5-ed 签名对每个请求进行签名的服务设置 JMeter 测试?

【问题讨论】:

    标签: ruby time jmeter performance-testing


    【解决方案1】:

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

    1. 将 Beanshell PreProcessor 添加为执行该 API 调用的 HTTP 请求的子项
    2. 将以下代码放入预处理器的“脚本”区域(它基本上相当于 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

    演示:

    参考资料:

    【讨论】:

    • Dmitry,能否请您显示一个屏幕截图,说明该变量“sig”在 HTTP 请求中是如何引用的(= BeanShell 预处理器上方的一级)?我需要在那里创建一个没有值的变量吗?还是 HTTP 请求自动从子进程中获取“sig”变量,并且无需任何额外努力就可以在 URL 中使用它?
    • DigestUtils 是否已弃用?这似乎不再有效?
    猜你喜欢
    • 2014-07-04
    • 2014-10-24
    • 2021-06-03
    • 2014-09-26
    • 1970-01-01
    • 2017-11-06
    • 2022-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多