OAuth 2.0 autentimine Gatlingiga, kasutades kandja märki

Selles postituses selgitatakse, kuidas Gautlinguga Oauth2 autentimist teha.

Selles näites saadame kasutaja loomise taotluse. Kasutaja lõpp-punkt on siiski kaitstud ja nõuab access_token.

Kõigepealt saame me kandja_token või access_token ja seejärel saadame selle päisena kasutaja loomise järgmisele API-taotlusele.


Selle illustreerimiseks kasutame Gatlingi jaoks sama projekti struktuuri, mille me varem ehitasime:

Performance Testing Framework koos Gatlingi ja Maveniga


Kui järgime ülaltoodud postituse samme, oleks meie projekti struktuur järgmine:





Parameetrite määratlemine konfiguratsioonis

Kõigepealt määratleme oma OAuth 2.0 parameetrid Configuration.scala objektifaili all konfig kaust:

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' } Märge:Tavaliselt eksporditakse keskkond, kliendi ID ja kliendi saladused masinas, kus testid töötavad, nii et saame kasutada System.getProperty () väärtuste lugemiseks.

Taotlused

Nüüd peame kirjutama koodi, mis saadab taotluse volitusserverile kandja märgi saamiseks.


OAuth 2.0 päring - juurdepääsukõne

See fail AuthRequest.scala on salvestatud taotlusi kaust meie projekti struktuuris.

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

Ülalolevas koodijupis salvestame ka faili access_token.

Ülaltoodud kõne saab lihtsalt juurdepääsu.

Kasutaja loomiseks vajame veel ühte taotlust, saates päiseks juurdepääsukõne.


Kasutaja taotlus

Meie kasutaja päring on failis nimega UserRequests.scala ja salvestatakse taotlusi kausta.

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


Stsenaarium

Nüüd kirjutame välja stsenaariumi objekti. Selles näites nimetatakse meie objekti UserScenarios.scala ja salvestatakse stsenaarium kausta.

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

Ülaltoodud taotlus saadab POST-i kasutaja loomiseks, kui päises on kandjana juurdepääsukõne access_token.



Simulatsioon

Lõpuks meie simulatsioonifail nimega UserSimulation.scala on salvestatud simulatsioonid kausta.


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

Kasutatavate testide läbiviimiseks

mvn clean gatling:test