OAuth 2.0 provjera autentičnosti pomoću Gatlinga pomoću nositelja tokena

Ovaj post objašnjava kako napraviti Oauth2 autentifikaciju s Gatlingom.

U ovom primjeru šaljemo zahtjev za stvaranje korisnika. Međutim, korisnička krajnja točka je zaštićena i zahtijeva access_token.

Prvo ćemo dobiti bearer_token ili access_token, a zatim ćemo ga poslati kao zaglavlje na sljedeći API zahtjev za stvaranje korisnika.

Da bismo to ilustrirali, koristit ćemo istu strukturu projekta za Gatling koju smo prethodno izgradili:

Okvir za ispitivanje performansi s Gatlingom i Mavenom

Kad slijedimo korake iz gornjeg posta, imali bismo strukturu projekta kako slijedi:



Definiranje parametara u konfiguraciji

Prvo definiramo naše parametre OAuth 2.0 u Configuration.scala objektna datoteka pod konfiguracija mapa:

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' } Bilješka:Obično se okolina, client_id i client_secrets izvoze u stroj koji će testovi izvoditi, tako da možemo koristiti System.getProperty () za čitanje vrijednosti.

Zahtjevi

Sada moramo napisati kod koji šalje zahtjev autorizacijskom poslužitelju za dobivanje tokena nositelja.

Zahtjev za OAuth 2.0 - access_token

Ova datoteka AuthRequest.scala je spremljeno pod zahtjevi u našoj strukturi projekta.

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

U gornjem isječku koda također spremamo access_token u datoteku.

Gornji poziv samo dobiva access_token.

Trebamo još jedan zahtjev za stvaranje korisnika slanjem access_token kao zaglavlja.

Zahtjev korisnika

Naš korisnički zahtjev nalazi se u datoteci koja se zove UserRequests.scala i sprema se pod zahtjevi mapu.

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

Scenarij

Sada zapisujemo objekt scenarija. U ovom se primjeru naš objekt naziva UserScenarios.scala i sprema se pod scenarij mapu.

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

Gornji zahtjev šalje POST zahtjev za stvaranje korisnika s pristupnim_tokenom kao nositeljem u zaglavlju.

Simulacija

Napokon, naša simulacijska datoteka pod nazivom UserSimulation.scala je spremljeno pod simulacije mapu.

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

Za pokretanje testova koje koristimo

mvn clean gatling:test