簡體   English   中英

如何使用通用模塊Gatling3.1生成HMAC簽名

[英]How to generate a HMAC signature using common module Gatling3.1

我正在為HMAC身份驗證授權的微服務制作測試腳本。 該腳本由gatling-3.1編寫。我面臨一個問題,生成HMAC簽名的過程是多余的。

我像這樣在Github中引用了示例代碼: https : //github.com/gatling/gatling/blob/ace52b37bc60e5ebc168385694a283c4851cb3f9/gatling-http/src/test/scala/io/gatling/http/compile/HttpCompileTest.scala#L229-L245

我編寫了代碼,並確認已將計算出的簽名添加到每個請求的Authorization標頭中。 但是我不知道如何按模塊生成簽名,因此,我的代碼仍然是多余的。

請注意(1)和(2)。

package computerdatabase

class BasicSimulation extends Simulation {

  val httpProtocol = http
    .baseUrl("http://computer-database.gatling.io") // Here is the root for all relative URLs

  val scn = scenario("Scenario Name") // A scenario is a chain of requests and pauses
    .exec(http("request_1")
    .get("/")
    //---------- (1) Calculate signature in "request_1" by customized logic ----------
    .sign(new SignatureCalculator {                   
      override def sign(request: Request): Unit = {
        import java.util.Base64
        import javax.crypto.Mac
        import javax.crypto.spec.SecretKeySpec
        val mac = Mac.getInstance("HmacSHA256")
        mac.init(new SecretKeySpec("THE_SECRET_KEY".getBytes("UTF-8"), "HmacSHA256"))
        val rawSignature = mac.doFinal("".getBytes("UTF-8"))
        val authorization = Base64.getEncoder.encodeToString(rawSignature)
        request.getHeaders.add("Authorization", authorization)
      }
    })
    //---------- (1) End ----------
    )
    .pause(7) // Note that Gatling has recorded real time pauses
    .exec(http("request_2")
    .get("/computers?f=macbook")
    //---------- (2) Calculate signature in "request_2". Same logic as (1)...It is redundant----------
    .sign(new SignatureCalculator {
      override def sign(request: Request): Unit = {
        import java.util.Base64
        import javax.crypto.Mac
        import javax.crypto.spec.SecretKeySpec
        val mac = Mac.getInstance("HmacSHA256")
        mac.init(new SecretKeySpec("THE_SECRET_KEY".getBytes("UTF-8"), "HmacSHA256"))
        val rawSignature = mac.doFinal("".getBytes("UTF-8"))
        val authorization = Base64.getEncoder.encodeToString(rawSignature)
        request.getHeaders.add("Authorization", authorization)
      }
    })
    //---------- (2) End ----------
    )
  setUp(scn.inject(atOnceUsers(1)).protocols(httpProtocol))
}

我想使用可維護性模塊來計算request_1和request_2的簽名。 如果您知道,請告訴我。

解決方案:謝謝喬治。 我可以刪除冗余代碼,如下所示。

package computerdatabase

import io.gatling.core.Predef._
import io.gatling.http.Predef._
import scala.concurrent.duration._

object Hmac {
  val signatureCalculator = new SignatureCalculator {
    override def sign(request: Request): Unit = {
      import java.util.Base64
      import javax.crypto.Mac
      import javax.crypto.spec.SecretKeySpec
      val mac = Mac.getInstance("HmacSHA256")
      mac.init(new SecretKeySpec("THE_SECRET_KEY".getBytes("UTF-8"), "HmacSHA256"))
      val rawSignature = mac.doFinal("".getBytes("UTF-8"))
      val authorization = Base64.getEncoder.encodeToString(rawSignature)
      request.getHeaders.add("Authorization", authorization)
    }
  }
}

只需使用一個變量來保存SignatureCalculator

val signatureCalculator = new SignatureCalculator {
  // ...

或使用lambda語法

val signatureCalculator: SignatureCalculator = { request =>

那你可以做

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

如果虛擬用戶的密鑰不同,則必須將其設置為Expression 要依賴會話屬性,您可以編寫如下內容:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM