Xác thực OAuth 2.0 với Gatling bằng Bearer Token

Bài đăng này giải thích cách thực hiện Xác thực Oauth2 với Gatling.

Trong ví dụ này, chúng tôi đang gửi yêu cầu tạo người dùng. Tuy nhiên, điểm cuối của người dùng được bảo vệ và yêu cầu một access_token.

Đầu tiên, chúng tôi sẽ lấy một bearer_token hoặc một access_token và sau đó gửi nó dưới dạng tiêu đề cho yêu cầu API tiếp theo để tạo người dùng.


Để minh họa điều này, chúng tôi sẽ sử dụng cùng một cấu trúc dự án cho Gatling mà chúng tôi đã xây dựng trước đây:

Khung kiểm tra hiệu suất với Gatling và Maven


Khi chúng ta làm theo các bước trong bài đăng trên, chúng ta sẽ có cấu trúc dự án của chúng ta như sau:





Xác định các tham số trong cấu hình

Đầu tiên, chúng tôi xác định các tham số OAuth 2.0 của chúng tôi trong Configuration.scala tệp đối tượng dưới cấu hình thư mục:

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' } Ghi chú:Thông thường, môi trường, client_id và client_secrets được xuất trong máy, các bài kiểm tra sẽ đang chạy, vì vậy chúng ta có thể sử dụng System.getProperty () để đọc các giá trị.

Yêu cầu

Bây giờ chúng ta cần viết mã gửi yêu cầu đến máy chủ ủy quyền để lấy mã thông báo mang.


Yêu cầu OAuth 2.0 - access_token

Tập tin này AuthRequest.scala được lưu dưới yêu cầu thư mục trong cấu trúc dự án của chúng tôi.

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

Trong đoạn mã trên, chúng tôi cũng đang lưu access_token vào một tệp.

Cuộc gọi ở trên, chỉ nhận được access_token.

Chúng tôi cần một yêu cầu khác để tạo người dùng bằng cách gửi access_token làm tiêu đề.


Yêu cầu của người dùng

Yêu cầu người dùng của chúng tôi nằm trong một tệp có tên UserRequests.scala và được lưu dưới yêu cầu thư mục.

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


Tình huống

Bây giờ chúng ta viết ra đối tượng kịch bản. Trong ví dụ này, đối tượng của chúng ta được gọi là UserScenarios.scala và được lưu dưới kịch bản thư mục.

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

Yêu cầu trên, gửi một yêu cầu POST để tạo một người dùng có access_token làm người mang trong tiêu đề.



Mô phỏng

Cuối cùng, tệp mô phỏng của chúng ta có tên là UserSimulation.scala được lưu dưới mô phỏng thư mục.


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

Để chạy các bài kiểm tra chúng tôi sử dụng

mvn clean gatling:test