简体   繁体   English

使用 Gatling 通过变量传递 Bearer 令牌

[英]Passing Bearer token through variable using Gatling

I am learning the Gatling tool and stuck in developing scenarios for Secure Http API calls.我正在学习 Gatling 工具并坚持开发安全 Http API 调用的场景。 I have created a scenario in which I am able to get the bearer token and save it in the variable(Token), but the variable(Token) is not passing its value in the authorization header.我创建了一个场景,在该场景中我能够获取不记名令牌并将其保存在变量(令牌)中,但变量(令牌)未在授权 header 中传递其值。

Here's my code pleaser review it,这是我的代码请检查它,

The value of the token variable is not getting by the following code line, .authorizationHeader(s"Bearer $token")令牌变量的值未通过以下代码行获取,.authorizationHeader(s"Bearer $token")

====================================================== ================================================ ====


import io.gatling.core.Predef._

import io.gatling.http.Predef._

import scala.concurrent.duration._

import scala.collection.JavaConversions._


class SampleToken2 extends Simulation {




  //Token define
  
  private var token: String = ""
  
  val auth = scenario("Retrieve Token")
    .exec(
      http("POST Auth Req")
        .post("http://iserver:9092/login")
        .body(ElFileBody("bodies/inventalogin.json")).asJson
        .check(bodyString.saveAs("Auth_Response"))
        .check(status.is(200))
        .check(jsonPath("$.token").find.saveAs("accesskey")))
    .exec{session => { token = session("accesskey").as[String]
      session}}
  

  

  //Header Define  
  
  val httpConf = http
    .baseUrl("http://iaserver:9092")
    .authorizationHeader(s"Bearer $token")
    .acceptHeader("application/json, */*")
    .acceptCharsetHeader("UTF-8") // Here are the common headers
    .doNotTrackHeader("1")
    .acceptLanguageHeader("en-UK,en;q=0.5")
    .acceptEncodingHeader("gzip, deflate")
    .userAgentHeader("Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0")
    .shareConnections
    .proxy(Proxy("localhost", 8888).httpsPort(8888))


    def  myTestObjectMethod = {
      exec { session => println("token print2"); session }
      exec { session => println(token:String); session }
      exec(http("Get all devices with pagination")
        .get("/devices/getAllDevices?page=0&size=200")
        .check(status.in(200 to 210)))
        .pause(1, 20)
    }



  val scn = scenario("my_actual_load_test").exec(myTestObjectMethod)



  setUp(
    auth.inject(constantUsersPerSec(1) during (1 seconds)),
    scn.inject(nothingFor(2 seconds),
      constantUsersPerSec(50) during (300 seconds)
    )
    .protocols(httpConf))
    .assertions(global.responseTime.max.lt(500)) 
    .assertions(forAll.failedRequests.percent.lte(1)) 
    .assertions(global.responseTime.mean.lte(100))

}

Your token is not getting used because you're transferring it to a standard scala variable rather than just passing it through the session.你的令牌没有被使用,因为你将它转移到标准的 scala 变量,而不是仅仅通过 session 传递它。

Gatling builders are executed once at startup, so when your httpConf references $token it's getting the value from that var at a time before any requests have been made - hence the value of token will be "" . Gatling 构建器在启动时执行一次,因此当您的httpConf引用$token时,它会在发出任何请求之前一次从该 var 获取值 - 因此token的值将为""

Since you seem to want one call to get a token that is then used by all users in the second scenario, you need to load the value in the token var into the session and update you header httpConf to use the Gatling EL (which will pull the value from the session)由于您似乎希望通过一次调用获得一个令牌,然后在第二种情况下供所有用户使用,因此您需要将token var 中的值加载到 session 并更新您 header httpConf以使用 Gatling EL(这将拉来自会话的值)

val httpConf = http
.baseUrl("http://iaserver:9092")
.authorizationHeader("Bearer ${token}")
.acceptHeader("application/json, */*")
...

def  myTestObjectMethod = {
  exec(session => session.set("token", token)
  .exec(http("Get all devices with pagination")
    .get("/devices/getAllDevices?page=0&size=200")
    .check(status.in(200 to 210))
  )
  .pause(1, 20)
}

Got my answer from the below link: Gatling Scala:Unable to send auth token to the method using session variable从以下链接得到我的答案: Gatling Scala:Unable to send auth token to the method using session variable

I need to pass the token method in the scenario in order to get the token in the session.我需要在场景中传递令牌方法才能在 session 中获取令牌。



  val authAPI = exec(
    exec(
      http("POST Auth API")
        .post("http://iserver:9092/login")
        .body(ElFileBody("bodies/inventalogin.json")).asJson
        .check(bodyString.saveAs("Auth_Response"))
        .check(status.is(200))
        .check(jsonPath("$.token").find.saveAs("token")))
      exec{session => { tokenAPI = session("token").as[String]
      session}}

var headers_10 = Map("Content-Type" -> """application/json""", "Authorization" -> "Bearer ${token}")

  def  getAllDevices() = {
    exec { session => println("token print2"); session }
    exec { session => println(tokenAPI:String); session }
    exec(session => session.set("token", tokenAPI))
    exec(http("Get all devices")
      .get("/devices/getAllDevices")
      .headers(headers_10)
      .check(status.in(200 to 210)))
      //.exec { session => println(session); session }

      .pause(1, 20)
  }

// Scenario Definition
  val scn = scenario("Basic")
    .exec(authAPI)
    .pause(1)
    .exec(getAllDevices())
    .pause(1)
    .exec(getAllDevicesPagination())
    .pause(1)
    .exec(logintest())


声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何使用“x-auth-token”而不是“授权”承载获取 Postman? - How to get Postman using "x-auth-token" not "Authorization" bearer? 如何在QTP中添加Oauth Bearer令牌 - How to add Oauth Bearer token in QTP 使用python将变量传递给bash命令 - Passing a variable into bash command using python api测试如何放心发送bearer token授权 - How to send bearer token authorization in rest assured for api testing 尝试使用承载令牌执行 API 调用时获取 401,承载令牌部署并受 Azure 广告身份验证保护 - Getting 401 while trying perform API call with bearer token which is deployed and protected with Azure Ad Authentication 使用 OAuth 2.0 使用可变令牌进行 API 调用 - Make an API call with variable token with OAuth 2.0 将量角器命令行参数作为变量传递 - Passing Protractor command line parameters as variable 如何通过传递用户名和密码从身份服务器获取访问令牌? - How to get access token from Identity Server by passing username and password? 通过传递变量自动化 SQL 脚本的最佳方法 - Best way to automate SQL scripts by passing variable 将 guid 和路径作为变量传递给 bcdedit /set - passing guid and path to bcdedit /set as a variable
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM