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

Как обойти oauth2.0 при создании rest api test на java?

rest
api
rest-assured
testing
java
Теги: #<Tag:0x00007f7b62b74320> #<Tag:0x00007f7b62b741e0> #<Tag:0x00007f7b62b740a0> #<Tag:0x00007f7b6d5bbec8> #<Tag:0x00007f7b6d5bbd60>

(Matthew Prok) #1

Пытаюсь освоить api тесты на джава. У меня на проекте используется протокол авторизации oauth 2.0.

public class Tests {

    private String access_token = "NTM1ZDYyNjg0NTUyM2YzMzg4YmVmNmIzOTA5Yzk3OWQ5OTUzYjBiMTIxMjFkMzQ0ZDFhOTY4ZmEyZjlkMWVjNw";

    @Test
    public void firstTest()
    {
        Response response = given().auth().oauth2(access_token, OAuthSignature.HEADER)
                .contentType(ContentType.JSON).accept(ContentType.JSON).log().all()
                .when()
                .get("http://api.testgrup.ru/v1/storages/2/parts")
                .then().log().all().extract().response();

    }
}

Результатом выполнения является:

{
    "error": {
        "common": [
            "oauth_access_denied"
        ]
    }
}

Подскажите, пожалуйста, в чем проблема?


(Богдан Ткаченко) #2

А что если не использовать сигнатуру, а только токен, тоже такой же ответ возвращает?


(Matthew Prok) #3

Пытался без сигнатуры, к сожалению тот же самый результат.


(Богдан Ткаченко) #4

А токен вы в точности скопировали? Может в токене допустили ошибку?


(Sergey Korol) #5

Этот generic error может означать все, что угодно: от неверного токена до отсутствующих скоупов. Без детального описания ошибки все это - гадание на кофейной гуще.

Лучше узнать у девелоперов напрямую, что необходимо для корректной авторизации.


(Matthew Prok) #6

К сожалению скопировал в точности.


(Matthew Prok) #7

Полный результат теста представлен ниже, помимо этого больше ничего нет.

Request method:	GET
Request URI:	http://api.testgrup.ru/v1/storages/2/parts?status=3&limit=50&offset=0
Proxy:			<none>
Request params:	<none>
Query params:	<none>
Form params:	<none>
Path params:	<none>
Headers:		Accept=application/json, application/javascript, text/javascript, text/json
				Content-Type=application/json; charset=UTF-8
Cookies:		<none>
Multiparts:		<none>
Body:			<none>
HTTP/1.1 401 Unauthorized
Server: nginx/1.14.0
Content-Type: application/json
Transfer-Encoding: chunked
Connection: keep-alive
Cache-Control: no-cache, private
Date: Wed, 20 Jun 2018 08:53:35 GMT
X-Debug-Token: f9b736
X-Debug-Token-Link: http://api.testgrup.ru/_profiler/f9b736

{
    "error": {
        "common": [
            "oauth_access_denied"
        ]
    }
}

===============================================
Default Suite
Total tests run: 1, Failures: 0, Skips: 0
===============================================


Process finished with exit code 0


(Denis K.) #8

Authorization: Bearer {{oauth_token}}


(Sergey Korol) #9

Ну так из полного лога видно, что 401 пришла. Что мешает со своими девелоперами обсудить? Токен ведь может быть ограниченным по времени жизни, или нуждаться в рефреше. Возможно нужно передавать спец scopes. У соответствующего юзера может не быть прав доступа к определенным end points и т.п.


(Gordon Freeman) #10

Чтобы понять работать будет или нет, я бы на вашем месте сперва провел аналогичный тест в postman или soapui, заодно точно узнали бы, что ещё необходимо в хедере передать.
Ещё рекомендую валидировать ваш токен через jwt.io сайт, там точно увидите скоупы и время жизни.
И конечно обсудить с девами, у нас например на одном проекте хватало только одного токена и жил он ровно час, а на другом токен мог умереть вчера, а сессия живёт 3 года… Т.е.если есть сессия токен уже не нужен, что вроде упрощает вашу работу.


(Matthew Prok) #11

В итоге методы auth().oauth2 заменил на headers() и всё заработало.


(Gordon Freeman) #12

Показал бы пример, а то как спрашивают - показывают код, а как поменяют, то из темы вон))


(Vatslau) #13

какой-то манки тестинг
свой же сервис! контракт должен быть.
если нет

  • сниф запроса
  • разбор параметров
  • курлом тест
  • дальше любой клиент (имхо лучше всего если нужно парсить контент в айфремах - Ретрофит+ХттпОк)

поэтому я не люблю всякую фигню типа таких либ.
завтра разработчики добавят чтото типа уид\константу или ещё что в хидер
и будешь неделю ломать голову с таки подходом ИМХО.