如何从 cookie 中保存 XSRF 令牌并将其传递给 Gatling 的下一个请求标头中的服务器

Posted

技术标签:

【中文标题】如何从 cookie 中保存 XSRF 令牌并将其传递给 Gatling 的下一个请求标头中的服务器【英文标题】:How can save XSRF token from cookie and pass it to server in next request header in Gatling 【发布时间】:2020-10-19 08:34:23 【问题描述】:

我正在尝试使用 Gatling 执行负载测试,我需要从 cookie 中保存 X-XSRF-TOKEN 并将其传递到下一个请求标头中。这是我的场景:

import scala.concurrent.duration._
import io.gatling.core.Predef._
import io.gatling.http.Predef._
import io.gatling.jdbc.Predef._
import scala.util.Random

class addvehicle extends Simulation 

    object randomIntegerGenerator 
        def randomInteger(range: Int) =
            scala.util.Random.nextInt(range).toString
    
    val feeder = Array(
        Map( "Authorization" -> "Bearer XXXX" ),
        Map( "Authorization" -> "Bearer YYYY" )
    ).random

    val httpProtocol = http
        .baseUrl("https://192.168.165.176:30479")
        .inferhtmlResources()
        .acceptHeader("application/json, text/plain, */*")
        .acceptEncodingHeader("gzip, deflate")
        .acceptLanguageHeader("IR")
        .userAgentHeader("Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:81.0) Gecko/20100101 Firefox/81.0")
    val headers_8 = Map("X-XSRF-TOKEN" -> "f50b2810-ee6a-435b-87d6-5a40dd45bbb1")

    val headers_9 = Map(
        "Content-Type" -> "application/json",
        "Origin" -> "https://192.168.165.176:30479"

    val headers_10 = Map(
        "Content-Type" -> "application/json",
        "Origin" -> "https://192.168.165.176:30479"

    val headers_11 = Map("X-XSRF-TOKEN" -> "050e6282-febd-4452-a68b-e88fbc8d3134")

    val req = s""""entryDate":"2020-10-03","vehicleVersion":"vehicleVersionValue"]"""

    var randomSession = Iterator.continually(
        Map(
            "randsession" -> (req
                .replace("vehicleVersionValue", randomIntegerGenerator.randomInteger(10))
                )
        ))

    val scn = scenario("addvehicle")
        .feed(feeder)
        .feed(randomSession)
        .pause(1)
        .exec(
            http("request_8")
                .get("/find/usable?category=Vehicle")
                .header("Authorization","$Authorization")
                .headers(headers_8))
        .pause(1)
        .exec(getCookieValue(CookieKey("XSRF-TOKEN").saveAs("X-XSRF-TOKEN")))
        .exec(
            http("request_9")
                .post("/api/universal/search")
                .header("Authorization","$Authorization")
                .header("X-XSRF-TOKEN","$X-XSRF-TOKEN")
                .headers(headers_9)
                .body(ElFileBody("C:/Users/test/Downloads/Gatling/user-files/resources/addvehicle/0009_request.json")))
        .pause(1)
        .exec(getCookieValue(CookieKey("XSRF-TOKEN").saveAs("X-XSRF-TOKEN1")))
        .exec(
            http("request_10")
                .post("/api/vehicle/create")
                .header("Authorization","$Authorization")
                .header("X-XSRF-TOKEN","$X-XSRF-TOKEN1")
                .headers(headers_10)
                .body(StringBody("""$randsession"""))
                .resources(http("request_11")
                    .get("/api/bank/find")
                    .header("Authorization","$Authorization")
                    .headers(headers_11),
                    http("request_12")
                        .get("/api/vehicle/find?page=0&size=6&sort=createdDate,DESC")
                        .header("Authorization","$Authorization")
                        .headers(headers_11)))

    setUp(scn.inject(atOnceUsers(5))).protocols(httpProtocol)

我想从请求 8 cookie 中保存 X-XSRF-TOKEN 并在请求 9 标头中将其传递给服务器,在这种情况下如何使用 check()saveAs() API 执行多次负载测试?

【问题讨论】:

【参考方案1】:

使用headerheaderRegex check 解析Set-Cookie 标头,或使用getCookieValue action 获取cookie 值。

【讨论】:

我们的服务器在浏览器 cookie 中存储 X-XSRF-TOKEN 并期望它在下一个请求标头中,我尝试在下一个请求之前使用 .exec(getCookieValue(CookieKey("X-XSRF-TOKEN")).saveAs("X-XSRF-TOKEN")) 存储 X-XSRF-TOKEN 但出现错误:value saveAs is not a member of io.gatling.http.action.cookie.GetCookieValueBuilder 逗号错误:.exec(getCookieValue(CookieKey("X-XSRF-TOKEN").saveAs("X-XSRF-TOKEN")))。 我将.exec 添加到我的场景中,但是当我打印会话时,$X-XSRF-TOKEN$X-XSRF-TOKEN1 具有相同的值。 我在保存 cookie 后刷新了会话 cookie,它可以工作了!谢谢。

以上是关于如何从 cookie 中保存 XSRF 令牌并将其传递给 Gatling 的下一个请求标头中的服务器的主要内容,如果未能解决你的问题,请参考以下文章

从 OWIN Cookie 获取不记名令牌并将其放在 API 请求中

401 无效令牌/handler.xsrf_token 与 cookie 不匹配

如何使用标头中的用户 JWT 令牌转发授权并将其与 cookie 中的 JWT 令牌进行比较以验证用户?

Angular 和 PHP JWT 和 CSRF (XSRF) Cookie

如何使用 HttpClientXsrfModule angular 6 添加 x-xsrf-token

如果用于认证的JWT令牌保存在HTTP-Only cookie中,你如何从cookie中读取它,以便我可以在请求头中包含它?