По поиску на форуме не нашел похожего, поэтому создаю тему
Ребята, подскажите, сталкивался ли кто-то с тестированием 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.
Привет. Чтение документации не лень , если так показалось. Есть непонимае, что именно класть в accessToken, например, как в примере выше. Потому, что если в браузере повторить вызов API с Get методом, то мы увидим, что в хедере есть параметр “Authorization: Token undefined”, т.е. токен не определен.
Более того, есть в хедере значение и Cookie, вот они то меня и спасают, но для этого я не использую given().auth().oauth2(). Достаточно given().header() и в хедер кладу кукис, предварительно сохраненные из юайного теста. Т.е. из примера выше, мне кажеться что это “те же яй… только в профиль”.
У вас должно быть API возвращающее вам токен аутентификации, к примеру API логина в систему. Вы передаете туда параметрами кренденшалы, для авторизации, в ответе (респонсе) после реквеста - получаете значение токена. После получения сетите его в объект User, и уже из юзера при аутентификации в других местах, для этого юзера - передаете на апи значение токена, где вам нужен токен
Да, такой подход реализации я использую на “параллельном” проекте. Это понятно, если есть API для логина. Но, у OAuth 2.0, есть несколько способов, методов, которые поддерживаются той или иной реализацией или нет. В нашем случае, к сожалению, это является Cookies base implementation.
Когда я писал у меня было желание в тестах разделить проекты и уйти от UI. Чтобы API не зависило от тестов UI. Но, переговорив еще раз с разработчиками, другой реализации у нас нет. Соответственно, необходимо сначала выполнить UI тест, который выполнит авторизацию в системе, сохранить кукисы и потом их использовать в API тестах.
Я просто думал, что у RestAssured в методах oauth2() можно передавать логин и пароль, которым выполняется вход на UI. Но нет.
Зачем усложнять с 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