გამოიყენეთ REST- დარწმუნებული OAuth 2.0 ნაკადის მაგალითების შესამოწმებლად

OAuth 2.0 უზრუნველყოფს ოთხ განსხვავებულ ნაკადს, მაგრამ თითოეული ნაკადის მთავარი მიზანია მოიპოვეთ წვდომის_სიტყვა და გამოიყენეთ იგი დაცულ რესურსებზე წვდომისთვის.

ოთხი განსხვავებული დინებაა:

  • ავტორიზაციის კოდექსის მინიჭება
  • დაფარული საგრანტო ნაკადი
  • კლიენტის სერთიფიკატი
  • პაროლის მინიჭების ნაკადი

ეს სახელმძღვანელო გთავაზობთ კოდების მაგალითებს REST- ის საშუალებით OAuth 2.0 ნაკადის, ავტორიზაციის კოდის მინიჭებისა და კლიენტის სანდოობის ნაკადების შესამოწმებლად.




ავტორიზაციის კოდი საგრანტო ნაკადი

ეს არის ყველაზე გავრცელებული ნაკადი, სადაც კოდი გაიცემა და გამოიყენება მისი მისაღებად წვდომა_ საუბარი . მომხმარებლის კოდი შესვლის შემდეგ ეს კოდი გადაინაცვლებს წინა პროგრამას (ბრაუზერში). Access_token გაიცემა სერვერის მხრიდან, კლიენტის ავტორიზაცია ხდება მისი პაროლით და მიღებული კოდით.

სამსაფეხურიანი პროცესი:


  • 1 - მიიღეთ Auth Code
  • 2 - მიიღეთ წვდომის ნიშანი
  • 3 - გამოიყენეთ Access Token (დაცულ რესურსებზე წვდომისთვის)

მიიღეთ Auth Code

პირველი ნაბიჯი არის 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:

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 ამის შემდეგ შეგვიძლია თხოვნით მივმართოთ დაცულ რესურსებს.


იმედია თქვენთვის სასარგებლო აღმოჩნდა.

საინტერესო სტატიები