Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Автоматизированное тестирование RESTful API with OAuth

maven
testng
soapui
rest
java
json
api
rest-assured
Теги: #<Tag:0x00007f7b6504c508> #<Tag:0x00007f7b6504c3c8> #<Tag:0x00007f7b6504c288> #<Tag:0x00007f7b6504c148> #<Tag:0x00007f7b6504c008> #<Tag:0x00007f7b6506be80> #<Tag:0x00007f7b6506bd40> #<Tag:0x00007f7b6506bbd8>

(Ayarema) #1

Всем привет!

По поиску на форуме не нашел похожего, поэтому создаю тему :slight_smile:

Ребята, подскажите, сталкивался ли кто-то с тестированием API для подключения к которому надо пройти аутентификацию именно OAuth (вот тут есть описание спецификации, линк).

Попробовал через дебаг браузера посмотреть после авторизации, какое тело и хедер улетает на API и повторить тоже самое с теми же атрибутами через SoapUI клиент. Но получаю в логах ошибку, а в еррор логах сдоровенный стектрейс с ошибкой:

> Thu Mar 23 11:59:25 EET 2017:ERROR:org.apache.http.client.ClientProtocolException

Дев среду делали в обход, отключали авторизацию, но таким образом выключалась большая часть функциональности, что есть не правильно. Без нее нельзя, поэтому, прошу в комментариях не расписывать как улучшить инфраструктуру приложения без аутентификации/авторизации. Рассматриваем вариант - она есть и без нее никак.

Тесты пишу на #java + #rest-assured + JsonSimple + #testng + #maven .
Есть отдельный класс с конектом к серверу приложения, но увы, из-за OAuth аутентификации теперь просто достучаться до этого сервера не получиться, идет редирект на сервер авторизации через SSO, определения ролей и т.п. и после возврат на Origin url.

Спасибо.


(Диана Лебедева) #2

Привет, понимаю, что поздно, но вдруг кому понадобится еще. У нас REST API с аутентификацией oAuth. У Google есть библиотека для java (https://developers.google.com/identity/protocols/OAuth2WebServer), я ей пользуюсь.


(Eugene Moskalenko) #3

А чем вот это не подходит? - https://github.com/rest-assured/rest-assured/wiki/Usage#oauth

У меня вот так:

String accessToken;
Map<String, ?> requestPOSTParam;

Response response = 
    given().auth().oauth2(accessToken, OAuthSignature.HEADER)
        .contentType(ContentType.JSON).accept(ContentType.JSON)
             .body(requestPOSTParam).log().all()
                  .when().post("api_path")
                       .then().log().all().statusCode(201)
                            .extract().response();

(Михаил Братухин) #4

Требует чтения документации? :grin:


(Ayarema) #5

Привет. Чтение документации не лень :wink:, если так показалось. Есть непонимае, что именно класть в accessToken, например, как в примере выше. Потому, что если в браузере повторить вызов API с Get методом, то мы увидим, что в хедере есть параметр “Authorization: Token undefined”, т.е. токен не определен.

Более того, есть в хедере значение и Cookie, вот они то меня и спасают, но для этого я не использую given().auth().oauth2(). Достаточно given().header() и в хедер кладу кукис, предварительно сохраненные из юайного теста. Т.е. из примера выше, мне кажеться что это “те же яй… только в профиль”.


(Eugene Moskalenko) #6

У вас должно быть API возвращающее вам токен аутентификации, к примеру API логина в систему. Вы передаете туда параметрами кренденшалы, для авторизации, в ответе (респонсе) после реквеста - получаете значение токена. После получения сетите его в объект User, и уже из юзера при аутентификации в других местах, для этого юзера - передаете на апи значение токена, где вам нужен токен :slight_smile:

надеюсь понятненько обьяснил


(Ayarema) #7

Да, такой подход реализации я использую на “параллельном” проекте. Это понятно, если есть API для логина. Но, у OAuth 2.0, есть несколько способов, методов, которые поддерживаются той или иной реализацией или нет. В нашем случае, к сожалению, это является Cookies base implementation.

Когда я писал у меня было желание в тестах разделить проекты и уйти от UI. Чтобы API не зависило от тестов UI. Но, переговорив еще раз с разработчиками, другой реализации у нас нет. Соответственно, необходимо сначала выполнить UI тест, который выполнит авторизацию в системе, сохранить кукисы и потом их использовать в API тестах.

Я просто думал, что у RestAssured в методах oauth2() можно передавать логин и пароль, которым выполняется вход на UI. Но нет.

В любом случае, спасибо за варианты ответов.


(Eugene Moskalenko) #8

Ну если у вас такой костыль, тогда сведите к минимуму падение ui теста, посредством запуска в phantomjs + selenide


(Eugene Moskalenko) #9

Ссори, выше насоветовал вам фигни. Все же давайте попробуем избавится от UI тестов, в вашем фреймворке тестирования API…

https://github.com/rest-assured/rest-assured/wiki/Usage#authentication - в доке есть раздел “Form Authentication” - https://github.com/rest-assured/rest-assured/wiki/Usage#form-authentication. Тоесть пропарсите вашу форму авторизации, вытащите куки, заберете оттуда свой токен

Примеры: https://github.com/rest-assured/rest-assured/blob/master/examples/rest-assured-itest-java/src/test/java/io/restassured/itest/java/AuthenticationITest.java


#10

Зачем усложнять с form authentication?
По сути, если есть endpoint для логина, на который отправляется запрос с UI, то можно перенести его в RestAssured запрос, потом вытащить оттуда нужную cookie

.parameter("user", "name")
.parameter("password", "some_password")
.get("login_endpoint")
.then().extract().response(); 
String authToken = login_endpoint.getCookie("cookie name with auth token");```

Ну, а дальше подкладывать его в каждый запрос, можно вот так:
```RestAssured.requestSpecification = new RequestSpecBuilder().addHeader("auth header name", authToken).build();```
в таком случае, при всех последующих запросах, будет использоваться этот auth token