Аутентификация OAuth 2.0 с помощью Gatling с использованием токена носителя

В этом посте объясняется, как выполнить аутентификацию Oauth2 с помощью Gatling.

В этом примере мы отправляем запрос на создание пользователя. Однако конечная точка пользователя защищена и требует access_token.

Сначала мы получим bearer_token или access_token, а затем отправим его в качестве заголовка для следующего запроса API для создания пользователя.


Чтобы проиллюстрировать это, мы будем использовать ту же структуру проекта для Gatling, которую мы создали ранее:

Платформа тестирования производительности с помощью Gatling и Maven


Когда мы выполним шаги, описанные в вышеупомянутом посте, наша структура проекта будет следующей:



Определение параметров в конфигурации

Сначала мы определяем наши параметры OAuth 2.0 в Configuration.scala объектный файл под config папка:

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