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 заявка за създаване на потребител с access_token като носител в заглавката.



Симулация

Накрая нашият симулационен файл, наречен 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