„OAuth 2.0“ autentifikavimas naudojant „Gatling“ naudojant „Bearer Token“

Šiame įraše paaiškinta, kaip atlikti „Oauth2“ autentifikavimą naudojant „Gatling“.

Šiame pavyzdyje siunčiame užklausą sukurti vartotoją. Tačiau vartotojo galinis taškas yra apsaugotas ir reikalauja „access_token“.

Pirmiausia gausime „bearer_token“ arba „access_token“, tada išsiųsime jį kaip antraštę kitai API užklausai sukurti vartotoją.


Norėdami tai iliustruoti, „Gatling“ naudosime tą pačią projekto struktūrą, kurią anksčiau sukūrėme:

Našumo testavimo sistema su Gatlingu ir Mavenu


Kai atliksime aukščiau esančio įrašo veiksmus, projekto struktūra būtų tokia:



Parametrų nustatymas konfigūracijoje

Pirmiausia nustatome OAuth 2.0 parametrus Configuration.scala objekto failas pagal konfigūruoti aplankas:

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' } Pastaba:Paprastai aplinka, kliento ID ir kliento paslaptys yra eksportuojami į mašiną, kurioje bus vykdomi bandymai, todėl galime naudoti System.getProperty () perskaityti vertybes.

Prašymai

Dabar turime parašyti kodą, kuris siunčia užklausą į autorizacijos serverį, kad gautų nešiklio atpažinimo ženklą.


OAuth 2.0 užklausa - access_token

Šis failas AuthRequest.scala yra išsaugotas prašymus aplanką mūsų projekto struktūroje.

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
} }

Pirmiau pateiktame kodo fragmente mes taip pat išsaugome failą „access_token“.

Pirmiau pateiktas skambutis tiesiog gauna access_token.

Mums reikia dar vienos užklausos sukurti vartotoją, siunčiant antraštę „access_token“.


Vartotojo užklausa

Mūsų vartotojo užklausa yra faile, pavadintame UserRequests.scala ir yra išsaugotas prašymus aplanką.

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))) }


Scenarijus

Dabar mes išrašome scenarijaus objektą. Šiame pavyzdyje mūsų objektas vadinamas UserScenarios.scala ir yra išsaugotas scenarijus aplanką.

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) }

Pirmiau pateikta užklausa siunčia POST užklausą sukurti vartotoją, kurio antraštėje nešlys yra access_token.



Modeliavimas

Pagaliau mūsų modeliavimo failas pavadinimu UserSimulation.scala yra išsaugotas simuliacijos aplanką.


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)), ) }

Norėdami atlikti bandymus, mes naudojame

mvn clean gatling:test