Bearer Token yordamida Gatling bilan OAuth 2.0 autentifikatsiyasi

Ushbu xabarda Gatling bilan Oauth2 autentifikatsiyasini qanday qilish kerakligi tushuntirilgan.

Ushbu misolda biz foydalanuvchi yaratish uchun so'rov yuboramiz. Biroq, foydalanuvchi so'nggi nuqtasi himoyalangan va access_token talab qilinadi.

Birinchidan, biz bearer_token yoki access_token ni olamiz va keyin uni foydalanuvchi yaratish uchun keyingi API so'roviga sarlavha sifatida yuboramiz.


Buni ko'rsatish uchun biz Gatling uchun ilgari qurgan loyiha tarkibidan foydalanamiz:

Gatling va Maven yordamida ishlashni sinash doirasi


Yuqoridagi postdagi amallarni bajarganimizda, biz quyidagicha loyiha tarkibiga ega bo'lamiz:



Konfiguratsiyadagi parametrlarni aniqlash

Avval OAuth 2.0 parametrlarini Configuration.scala da aniqlaymiz ostidagi ob'ekt fayli konfiguratsiya papka:

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' } Eslatma:Odatda, atrof-muhit, mijoz_id va mijoz_sirlari eksport qilinadi, mashinada testlar ishlaydi, shuning uchun biz System.getProperty () qadriyatlarni o'qish.

So'rovlar

Endi biz avtorizatsiya serveriga so'rov yuboradigan kodni yozuvchi belgisini olish uchun yozishimiz kerak.


OAuth 2.0 so'rovi - access_token

Ushbu fayl AuthRequest.scala ostida saqlanadi so'rovlar loyiha tarkibimizdagi papka.

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

Yuqoridagi kod parchasida biz access_token faylini saqlaymiz.

Yuqoridagi qo'ng'iroq faqat access_token-ni oladi.

Access_token-ni sarlavha sifatida yuborish orqali foydalanuvchini yaratish uchun yana bir so'rov kerak.


Foydalanuvchi so'rovi

Bizning foydalanuvchi so'rovimiz UserRequests.scala nomli faylda va ostida saqlanadi so'rovlar papka.

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


Stsenariy

Endi senariy ob'ektini yozamiz. Ushbu misolda bizning ob'ektimiz UserScenarios.scala deb nomlangan va ostida saqlanadi stsenariy papka.

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

Yuqoridagi so'rov, sarlavhada tashuvchisi sifatida access_token bilan foydalanuvchi yaratish uchun POST so'rovini yuboradi.



Simulyatsiya

Va nihoyat bizning simulyatsiya faylimiz UserSimulation.scala ostida saqlanadi simulyatsiyalar papka.


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

Biz foydalanadigan testlarni o'tkazish uchun

mvn clean gatling:test