Аутентификатсияи OAuth 2.0 бо Gatling бо истифодаи нишони Bearer

Ин паём мефаҳмонад, ки чӣ гуна Authentication Oauth2 бо Gatling иҷро карда мешавад.

Дар ин мисол, мо дархосте барои эҷоди корбар мефиристем. Аммо, нуқтаи ниҳоии корбар муҳофизат мешавад ва access_token талаб мекунад.

Аввалан, мо bearer_token ё access_token мегирем ва пас онро ҳамчун сарлавҳа ба дархости навбатии API барои сохтани корбар мефиристем.


Барои нишон додани ин, мо ҳамон сохтори лоиҳаро барои Gatling истифода хоҳем кард, ки қаблан сохта будем:

Чаҳорчӯби санҷиши иҷро бо Gatling ва Maven


Вақте ки мо қадамҳои дар пости боло овардаро иҷро менамоем, мо сохтори лоиҳаи худро ба тариқи зайл хоҳем дошт:



Муайян кардани параметрҳо дар танзимот

Аввалан, мо параметрҳои OAuth 2.0-ро дар Configuration.scala муайян мекунем файли объект дар зери танзим ҷузвдон:

object Configuration { val environment: String = System.getProperty('environment') val clientId: String = System.getProperty('CLIENT_ID') val clientSecret: String = System.getProperty('CLIENT_SECRET') val apiURL: String = 'https://some-sub-domain.' + environment + 'some-domain.com/api' var tokenPath: String = 'https://some-sub-domain' + environment + '.eu.auth0.com/oauth/token' val userPath = '/identity/iaa/v1/users' } Шарҳ:Одатан, муҳити атроф, client_id ва client_srets дар мошин содир карда мешавад, санҷишҳо иҷро карда мешаванд, бинобар ин мо метавонем System.getProperty () барои хондани арзишҳо.

Дархостҳо

Ҳоло мо бояд рамзеро нависем, ки дархости худро ба сервери иҷозатнома фиристад, то нишони бардоранда гирад.


OAuth 2.0 Дархост - access_token

Ин парванда AuthRequest.scala дар зери захира карда мешавад дархостҳо ҷузвдон дар сохтори лоиҳаи мо.

import java.io.{BufferedWriter, FileWriter} import config.Configuration import io.gatling.core.Predef._ import io.gatling.http.Predef._ object AuthRequest { val getAccessToken = exec(http('Get access token')
.post(Configuration.tokenPath)
.body(StringBody(
s'''{

'client_id': '${Configuration.clientId}',

'client_secret': '${Configuration.clientSecret}',

'audience': 'https://some-domain-name.com/user',

'grant_type': 'client_credentials',

'scope': 'user:admin'
}'''
))
.asJson
.headers(Map('Content-Type' -> 'application/json'))
.check(status.is(200))
.check(jsonPath('$.access_token').saveAs('access_token')))
.exec {
session =>
val fw = new BufferedWriter(new FileWriter('access_token.txt', true))
try {

fw.write(session('access_token').as[String] + ' ')
}
finally fw.close()
session
} }

Дар порчаи рамзи дар боло овардашуда, мо инчунин access_token -ро ба файл сабт мекунем.

Занги боло, танҳо access_token мегирад.

Ба мо дархости дигаре лозим аст, ки корбарро тавассути фиристодани access_token ҳамчун сарлавҳа корбар созем.


Дархости корбар

Дархости корбари мо дар як файл бо номи UserRequests.scala ва дар зери захира карда мешавад дархостҳо ҷузвдон.

import config.Configuration.{apiURL, userPath} import io.gatling.core.Predef._ import io.gatling.http.Predef._ object UserRequests { private val auth0Headers = Map(
'Accept' -> 'application/json, text/javascript, */*; q=0.01',
'Content-Type' -> 'application/json',
'Authorization' -> 'Bearer ${access_token}') val createUser = exec(http('Create user')
.post(apiURL + userPath)
.headers(auth0Headers)
.body(ElFileBody('createUser.json'))
.check(status.is(201))) }


Сенария

Ҳоло мо объекти сенариро менависем. Дар ин мисол объекти мо UserScenarios.scala номида мешавад ва дар зери захира карда мешавад сенария ҷузвдон.

import requests.{AuthRequest, UserRequests} import io.gatling.core.Predef._ object UserScenarios { var userIds:Array[Map[String,String]] =
(100 to 900).toArray map ( x => { Map( 'userId' -> x.toString) }) val getAccessToken = scenario('Get token')
.exec(AuthRequest.getAccessToken) val createUserScenario = scenario('Create user')
.feed(userIds.circular)
.exec(UserAuthZRequest.getAccessToken)
.exec(UserRequests.createUser) }

Дархости дар боло овардашуда дархости POST барои сохтани корбар бо access_token ҳамчун баранда дар сарлавҳа мефиристад.



Моделиронӣ

Дар ниҳоят файли моделиронии мо бо номи UserSimulation.scala дар зери захира карда мешавад моделиронӣ ҷузвдон.


import scenario.UserScenarios import io.gatling.core.Predef._ import scala.concurrent.duration._ class UserSimulation extends Simulation { setUp(
UserScenarios.createUserScenario.inject(rampUsers(250) during (15 minutes)), ) }

Барои санҷишҳо, ки мо истифода мебарем

mvn clean gatling:test