[英]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.