OAuth 2.0 агымынын мисалдарын текшерүү үчүн REST-ынандырууну колдонуу

OAuth 2.0 төрт башка агымды камсыз кылат, бирок ар бир агымдын негизги максаты ушул access_token алуу жана аны корголгон ресурстарга жетүү үчүн пайдаланыңыз.

Төрт башка агым:

  • Авторизация кодунун гранты
  • Гранттын агымы
  • Кардардын ишеним грамотасы
  • Сыр сөздү берүү агымы

Бул окуу куралы OAuth 2.0 агымдарын, Authorization Code Grant жана Client Credential агымдарын текшерүү үчүн REST кепилденген код мисалдарын келтирет.




Авторизация кодунун грантынын агымы

Бул код чыгарылган жана аны алуу үчүн колдонулган эң кеңири тараган агым access_token . Бул код колдонуучу киргенден кийин алдыңкы колдонмого (браузерде) түртүлөт. Access_token сервер тарапта чыгарылып, кардар өзүнүн паролу жана алынган коду менен аутентификацияланат.

Үч кадам процесси:


  • 1 - Чындык кодун алыңыз
  • 2 - Access Token алыңыз
  • 3 - Access Tokenди колдонуңуз (корголгон ресурстарга жетүү үчүн)

Чындык кодун алыңыз

Биринчи кадам code алуу:

import io.restassured.RestAssured; import io.restassured.http.ContentType; import io.restassured.response.Response; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import static io.restassured.RestAssured.given; import java.util.Base64; public class RestAssuredOAuth2 {
public static String clientId = 'some_client_id';
public static String redirectUri = 'some_redirect_uri';
public static String scope = 'some_scope';
public static String username = 'some_email';
public static String password = 'some_password';
public static String encode(String str1, String str2) {
return new String(Base64.getEncoder().encode((str1 + ':' + str2).getBytes()));
}
public static Response getCode() {
String authorization = encode(username, password);

return


given()




.header('authorization', 'Basic ' + authorization)




.contentType(ContentType.URLENC)




.formParam('response_type', 'code')




.queryParam('client_id', clientId)




.queryParam('redirect_uri', redirectUri)




.queryParam('scope', scope)




.post('/oauth2/authorize')




.then()




.statusCode(200)




.extract()




.response();
}
public static String parseForOAuth2Code(Response response) {
return response.jsonPath().getString('code');
}
@BeforeAll
public static void setup() {
RestAssured.baseURI = 'https://some-url.com';
}
@Test
public void iShouldGetCode() {
Response response = getCode();
String code = parseForOAuth2Code(response);

Assertions.assertNotNull(code);
} }

Access Token алыңыз

Авторизациялык кодду алгандан кийин, андан кийин access_token сурап алсак болот:

public static Response getToken(String authCode) {
String authorization = encode(username, password);
return
given()

.header('authorization', 'Basic ' + authorization)

.contentType(ContentType.URLENC)

.queryParam('code', authCode)

.queryParam('redirect_uri', redirectUri)

.queryParam('grant_type', grantType)

.post('/oauth2/token')

.then()

.statusCode(200)

.extract()

.response();
}
public static String parseForAccessToken(Response loginResponse) {
return loginResponse.jsonPath().getString('access_token');
}
@Test
public void iShouldGetToken() {
Response tokenResponse = getToken(code);
String accessToken = parseForAccessToken(tokenResponse);
Assertions.assertNotNull(accessToken);
}

Access Token колдонуу

Акыры, жарактуу access_token болгондо, корголгон ресурстарга суроо-талаптарды жасай алабыз:

public static void getUsers() {
given().auth()
.oauth2(accessToken)
.when()
.get('/users')
.then()
.statusCode(200); }

Биз ошондой эле мүмкүндүк алуу токенин Authorization Header катары жөнөтө алабыз менен Bearer префикс:


Мисалы:

public static void getUsers() {
given()
.header('Authorization', 'Bearer ' + accessToken)
.when()
.get('/users')
.then()
.statusCode(200); }


Кардардын ишеним каттарынын агымы

Кардардын эсептик жазуу агымында UI (браузер) жок жана ал негизинен Machine-to-Machine авторизациясы үчүн колдонулат.

REST-кепилдик менен, мындай көрүнөт:

import io.restassured.RestAssured; import io.restassured.http.ContentType; import io.restassured.response.Response; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import static io.restassured.RestAssured.given; import static io.restassured.RestAssured.requestSpecification; public class RestAssuredOAuth2 {
public static Response response;
private String userAdminClientId = System.getenv('M2M_USER_ADMIN_CLIENT_ID');
private String userAdminClientSecret = System.getenv('M2M_USER_ADMIN_CLIENT_SECRET');
private String oauth2Payload = '{ ' +

' 'client_id': '' + userAdminClientId + '', ' +

' 'client_secret': '' + userAdminClientSecret + '', ' +

' 'audience': 'https://some-url.com/user', ' +

' 'grant_type': 'client_credentials', ' +

' 'scope': 'user:admin' }';
private static String createUserPayload = '{ ' +

' 'username': 'api-user', ' +

' 'email': 'api-user@putsbox.com', ' +

' 'password': 'Passw0rd123!', ' +

' 'firstName': 'my-first-name', ' +

' 'lastName': 'my-last-name', ' +

' 'roles': ['read'] }';
public void userAdminConfigSetup() {
requestSpecification = given().auth().oauth2(getAccessToken(oauth2Payload))


.header('Accept', ContentType.JSON.getAcceptHeader())


.contentType(ContentType.JSON);
}
public String getAccessToken(String payload) {
return given()


.contentType(ContentType.JSON)


.body(payload)


.post('/token')


.then().extract().response()


.jsonPath().getString('access_token');
}
@BeforeAll
public static void setup() {
RestAssured.baseURI = 'https://some-url.com';
}
@Test
public void createUser() {
userAdminConfigSetup();
response = given(requestSpecification)


.body(createUserPayload)


.post('/user')


.then().extract().response();

Assertions.assertEquals(201, response.statusCode());
} }


Корутунду

Бул жерде биз коддун мисалдарын REST-кепилдик менен келтирдик, кантип access_token OAuth 2.0 агымдарын колдонуу. Бир жолу биз access_token анда биз корголгон ресурстарга суроо-талаптарды жасай алабыз.


Жогоруда айтылгандар пайдалуу болду деп ишенем.