OAuth 2.0 төрт башка агымды камсыз кылат, бирок ар бир агымдын негизги максаты ушул access_token алуу жана аны корголгон ресурстарга жетүү үчүн пайдаланыңыз.
Төрт башка агым:
Бул окуу куралы OAuth 2.0 агымдарын, Authorization Code Grant жана Client Credential агымдарын текшерүү үчүн REST кепилденген код мисалдарын келтирет.
Бул код чыгарылган жана аны алуу үчүн колдонулган эң кеңири тараган агым access_token . Бул код колдонуучу киргенден кийин алдыңкы колдонмого (браузерде) түртүлөт. 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 (браузер) жок жана ал негизинен 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
анда биз корголгон ресурстарга суроо-талаптарды жасай алабыз.
Жогоруда айтылгандар пайдалуу болду деп ишенем.