Scala 如何使用通用模块Gatling3.1生成HMAC签名

Scala 如何使用通用模块Gatling3.1生成HMAC签名,scala,gatling,Scala,Gatling,我正在为HMAC认证授权的微服务制作测试脚本。该脚本由gatling-3.1编写 我面临一个问题,生成HMAC签名的过程是冗余的 我在Github中引用了如下示例代码: 我编写了代码,并确认在每个请求中计算出的签名被添加到授权头中。 但我不知道如何通过模块生成签名,因此,我的代码仍然是多余的 请注意(1)和(2) 包计算机数据库 类基本模拟扩展了模拟{ val httpProtocol=http .baseUrl(“http://computer-database.gatling.io“”//

我正在为HMAC认证授权的微服务制作测试脚本。该脚本由gatling-3.1编写 我面临一个问题,生成HMAC签名的过程是冗余的

我在Github中引用了如下示例代码:

我编写了代码,并确认在每个请求中计算出的签名被添加到授权头中。 但我不知道如何通过模块生成签名,因此,我的代码仍然是多余的

请注意(1)和(2)

包计算机数据库
类基本模拟扩展了模拟{
val httpProtocol=http
.baseUrl(“http://computer-database.gatling.io“”//这里是所有相关URL的根目录
val scn=scenario(“scenario Name”)//场景是一系列请求和暂停
.exec(http(“请求1”)
.get(“/”)
//----------(1)通过自定义逻辑计算“请求_1”中的签名----------
.sign(新签名计算器{
覆盖def标志(请求:请求):单位={
导入java.util.Base64
导入javax.crypto.Mac
导入javax.crypto.spec.SecretKeySpec
val mac=mac.getInstance(“HmacSHA256”)
mac.init(新的SecretKeySpec(“THE_SECRET_KEY”.getBytes(“UTF-8”),“HmacSHA256”))
val rawSignature=mac.doFinal(“.getBytes”(“UTF-8”))
val authorization=Base64.getEncoder.encodeToString(rawSignature)
request.getHeaders.add(“授权”,授权)
}
})
//----------(1)结束----------
)
.pause(7)//注意,Gatling记录了实时暂停
.exec(http(“请求_2”)
.get(“/computers?f=macbook”)
//----------(2)在“请求_2”中计算签名。逻辑与(1)相同…它是冗余的----------
.签名(新签名计算器){
覆盖def标志(请求:请求):单位={
导入java.util.Base64
导入javax.crypto.Mac
导入javax.crypto.spec.SecretKeySpec
val mac=mac.getInstance(“HmacSHA256”)
mac.init(新的SecretKeySpec(“THE_SECRET_KEY”.getBytes(“UTF-8”),“HmacSHA256”))
val rawSignature=mac.doFinal(“.getBytes”(“UTF-8”))
val authorization=Base64.getEncoder.encodeToString(rawSignature)
request.getHeaders.add(“授权”,授权)
}
})
//----------(2)结束----------
)
设置(scn.inject(atOnceUsers(1)).协议(httpProtocol))
}
我想使用一个模块计算请求_1和请求_2的签名,以便于维护。 如果你知道,请告诉我

解决方案: 谢谢你,乔治。我可以删除冗余代码如下

包计算机数据库
导入io.gatling.core.Predef_
导入io.gatling.http.Predef_
导入scala.concurrent.duration_
对象Hmac{
val signatureCalculator=新的signatureCalculator{
覆盖def标志(请求:请求):单位={
导入java.util.Base64
导入javax.crypto.Mac
导入javax.crypto.spec.SecretKeySpec
val mac=mac.getInstance(“HmacSHA256”)
mac.init(新的SecretKeySpec(“THE_SECRET_KEY”.getBytes(“UTF-8”),“HmacSHA256”))
val rawSignature=mac.doFinal(“.getBytes”(“UTF-8”))
val authorization=Base64.getEncoder.encodeToString(rawSignature)
request.getHeaders.add(“授权”,授权)
}
}
}

只需使用一个变量来保存您的
签名计算器

val signatureCalculator = new SignatureCalculator {
  // ...
或者使用

那你就可以了

.exec(http("request_2")
  .get("/computers?f=macbook")
  .sign(signatureCalculator)
)

如果虚拟用户的密钥不同,则必须将其设置为
表达式
。根据会话属性,您可以编写如下内容:

val signatureCalculator: Expression[SignatureCalculator] = { session =>
  session("secretKey")
    .validate[String]
    .map { secretKey =>
      { request =>
        // ...
      }
    }
}

只需使用一个变量来保存
签名计算器

val signatureCalculator = new SignatureCalculator {
  // ...
或者使用

那你就可以了

.exec(http("request_2")
  .get("/computers?f=macbook")
  .sign(signatureCalculator)
)

如果虚拟用户的密钥不同,则必须将其设置为
表达式
。根据会话属性,您可以编写如下内容:

val signatureCalculator: Expression[SignatureCalculator] = { session =>
  session("secretKey")
    .validate[String]
    .map { secretKey =>
      { request =>
        // ...
      }
    }
}

谢谢你的回复。我参考了这个代码,并确认它的工作!我在我的问题区域粘贴了重构代码。既然您创建了另一个文件只是为了签名,为什么不
object Hmac extensed SignatureCalculator{
?签名不依赖于请求体对我来说也很奇怪。这是因为您刚刚测试了一些东西吗?>object Hmac extensed SignatureCalculator为什么不呢{我尝试了“扩展”,但出现了此错误。
Hmac.scala:7:8:无法创建对象,因为类型为(x$1:io.gatling.http.client.Request)单元的方法登录特征SignatureCalculator未定义对象Hmac extends SignatureCalculator{
>你刚刚测试了一些东西?是的,我只是确认GET请求。我会修复代码。谢谢你的回复。我引用了这些代码并确认了它的工作!我在我的问题区域粘贴了重构代码。既然你已经创建了另一个用于签名的文件,为什么不
object Hmac Extendes SignatureCalculator{
?签名不依赖于请求的主体,这在我看来也很奇怪。这是因为您刚刚测试了一些东西吗?>为什么不使用object Hmac extends SignatureCalculator{我尝试了“extends”,但我遇到了这个错误。
Hmac.scala:7:8:不可能创建对象,因为方法sign in trait SignatureCalculator类型为(x$1:io.gatling.http.client.Request)单元未定义对象Hmac extends SignatureCalculator{
>您刚刚测试了一些东西?是的,我只是确认GET请求。我将修复代码。