OAuth 2.0 чор ҷараёни гуногунро таъмин мекунад, аммо ҳадафи асосии ҳар як ҷараён иборат аз он аст дастрасии_токенро дастрас кунед ва онро барои дастрасӣ ба захираҳои ҳифзшуда истифода баред.
Чор ҷараёни гуногун инҳоянд:
Ин дастур намунаҳои рамзро бо истифода аз REST-барои санҷиши ҷараёнҳои OAuth 2.0, ҷараёни гранти иҷозатнома ва эътимодномаи мизоҷ пешниҳод мекунад.
Ин ҷараёни маъмултаринест, ки дар он рамз дода мешавад ва барои ба даст овардани он истифода мешавад дастрасӣ . Пас аз ворид шудани корбар, ин рамз ба замимаи пешина (дар браузер) пахш карда мешавад. 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
дархост кунем:
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
дорем, пас мо метавонем ба захираҳои ҳифзшуда дархост пешниҳод кунем:
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 (браузер) надорад ва асосан барои иҷозати мошин ба мошин истифода мешавад.
Дар 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
пас мо метавонем ба захираҳои ҳифзшуда дархост пешниҳод кунем.
Умедворам, ки шумо гуфтаҳои болоро муфид донистед.