В этом посте объясняется, как выполнить аутентификацию 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 () чтобы прочитать значения.Теперь нам нужно написать код, который отправляет запрос на сервер авторизации для получения токена-носителя.
Этот файл 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