Аўтэнтыфікацыя OAuth 2.0 з Gatling з выкарыстаннем маркера на прад'яўніка

У гэтым паведамленні тлумачыцца, як зрабіць аўтэнтыфікацыю 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_secrets экспартуюцца ў машыне, дзе будуць працаваць тэсты, таму мы можам выкарыстоўваць 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 на стварэнне карыстальніка з маркерам доступу_адказчыкам у якасці носьбіта ў загалоўку.



Мадэляванне

Нарэшце, наш файл мадэлявання называецца 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