Notkun REST-fullviss til að prófa OAuth 2.0 flæðisdæmi

OAuth 2.0 veitir fjóra mismunandi flæði, en meginmarkmið hvers flæðis er að fáðu aðgangslykil og nota það til að fá aðgang að vernduðum auðlindum.

Fjórir mismunandi flæði eru:

  • Leyfiskóðastyrkur
  • Óbeint styrkflæði
  • Skilríki viðskiptavinar
  • Lykilorð Styrkflæði

Þessi námskeið veitir kóðadæmi sem nota REST-fullvissu til að prófa OAuth 2.0 flæði, heimildarstyrk og skilríkisflæði viðskiptavinar.

Heimildarkóði Styrkflæði

Þetta er algengasta flæðið þar sem kóði er gefinn út og notaður til að fá aðgangslykill . Þessum kóða er ýtt í framhliðaforrit (í vafranum) eftir að notandinn skráir sig inn. Aðgangslykillinn er gefinn út á netþjóninum og staðfestir viðskiptavininn með lykilorði sínu og kóða sem fékkst.

Þriggja þrepa ferli:

  • 1 - Fáðu auðkóða
  • 2 - Fáðu aðgangslykil
  • 3 - Notaðu aðgangslykil (til að fá aðgang að vernduðum auðlindum)

Fáðu auðkenni

Fyrsta skrefið er að fá 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);
} }

Fáðu aðgangslykil

Þegar við höfum fengið heimildarkóðann getum við beðið um 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);
}

Nota aðgangslykil

Að lokum, þegar við höfum gilt access_token, getum við þá beðið um verndaðar auðlindir:

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

Við getum líka sent aðgangslykilinn sem Authorization Header með Bearer forskeyti:

Til dæmis:

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

Skilríki viðskiptavinar

Skilríki viðskiptavinarins hefur enga HÍ (vafra) að gera og er aðallega notað til heimildar frá Vél til Vélar.

Í REST-fullvissu mun þetta líta út eins og:

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

Niðurstaða

Hér gáfum við upp kóðadæmi með REST-fullvissu um hvernig á að fá access_token með OAuth 2.0 flæðunum. Þegar við fáum access_token við getum þá beðið um verndaðar auðlindir.

Vona að þér hafi fundist ofangreint gagnlegt.