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

Всем привет!

По поиску на форуме не нашел похожего, поэтому создаю тему :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.

Спасибо.

Привет, понимаю, что поздно, но вдруг кому понадобится еще. У нас REST API с аутентификацией oAuth. У Google есть библиотека для java (Using OAuth 2.0 for Web Server Applications  |  Authorization  |  Google Developers), я ей пользуюсь.

А чем вот это не подходит? - Usage · rest-assured/rest-assured Wiki · GitHub

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

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();
1 лайк

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

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

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

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

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

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

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

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

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

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

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

Usage · rest-assured/rest-assured Wiki · GitHub - в доке есть раздел “Form Authentication” - Usage · rest-assured/rest-assured Wiki · GitHub. Тоесть пропарсите вашу форму авторизации, вытащите куки, заберете оттуда свой токен

Примеры: rest-assured/AuthenticationITest.java at master · rest-assured/rest-assured · GitHub

1 лайк

Зачем усложнять с 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