Рубрики
Без рубрики

БУДЬТЕ Уверены, Аутентификация

Узнайте, как аутентифицировать защищенные API с помощью REST Assured.

Автор оригинала: Ger Roza.

1. Обзор

В этом руководстве мы проанализируем, как мы можем пройти аутентификацию с помощью REST Assured, чтобы правильно протестировать и проверить защищенный API.

Инструмент обеспечивает поддержку нескольких схем аутентификации :

  • Базовая Аутентификация
  • Дайджест-Аутентификация
  • Проверка подлинности формы
  • OAuth 1 и OAuth 2

И мы увидим примеры для каждого из них.

2. Использование Базовой Аутентификации

Базовая схема аутентификации требует, чтобы потребитель отправил идентификатор пользователя и пароль, закодированные в Base64 .

БУДЬТЕ уверены, это простой способ настроить учетные данные, необходимые для запроса:

given().auth()
  .basic("user1", "user1Pass")
  .when()
  .get("http://localhost:8080/spring-security-rest-basic-auth/api/foos/1")
  .then()
  .assertThat()
  .statusCode(HttpStatus.OK.value());

2.1. Упреждающая Аутентификация

Как мы видели в предыдущем посте о проверке подлинности Spring Security , сервер может использовать механизм ответа на вызов , чтобы явно указать, когда потребителю необходимо пройти проверку подлинности для доступа к ресурсу.

По умолчанию REST Assured ожидает, пока сервер вызовет запрос, прежде чем отправлять учетные данные.

Это может быть проблематично в некоторых случаях, например, когда сервер настроен на получение формы входа в систему вместо ответа на вызов.

По этой причине библиотека предоставляет директиву preemptive , которую мы можем использовать:

given().auth()
  .preemptive()
  .basic("user1", "user1Pass")
  .when()
  // ...

С этим на месте, будьте уверены, отправит учетные данные, не дожидаясь Несанкционированного ответа.

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

3. Использование Дайджест-Аутентификации

Несмотря на то , что это также считается “слабым” методом аутентификации , использование Дайджест-аутентификации представляет собой преимущество по сравнению с базовым протоколом.

Это связано с тем, что эта схема позволяет избежать отправки пароля в открытом виде.

Несмотря на это различие, реализация этой формы аутентификации с уверенностью очень похожа на ту, которой мы следовали в предыдущем разделе:

given().auth()
  .digest("user1", "user1Pass")
  .when()
  // ...

Обратите внимание, что в настоящее время библиотека поддерживает только проверку подлинности с вызовом для этой схемы, поэтому мы не можем использовать preemptive () , как мы делали ранее.

4. Использование Проверки Подлинности Формы

Многие службы предоставляют HTML-форму для аутентификации пользователя, заполняя поля своими учетными данными.

Когда пользователь отправляет форму, браузер выполняет запрос POST с информацией.

Обычно форма указывает конечную точку, которую она будет вызывать с помощью атрибута action , и каждое поле input соответствует параметру формы, отправленному в запросе.

Если форма входа достаточно проста и следует этим правилам, то мы можем рассчитывать на то, что БУДЬТЕ уверены, чтобы выяснить эти значения для нас:

given().auth()
  .form("user1", "user1Pass")
  .when()
  // ...

В любом случае это не оптимальный подход, так как, будьте уверены, необходимо выполнить дополнительный запрос и проанализировать HTML-ответ, чтобы найти поля.

Мы также должны иметь в виду, что процесс все равно может завершиться неудачно, например, если веб-страница сложна или если служба настроена с контекстным путем, который не включен в атрибут action .

Поэтому лучшим решением будет предоставить конфигурацию самостоятельно, явно указав три обязательных поля:

given().auth()
  .form(
    "user1",
    "user1Pass",
    new FormAuthConfig("/perform_login", "username", "password"))
  // ...

Помимо этих базовых конфигураций, БУДЬТЕ уверены, что корабли с функциональностью:

  • обнаружение или указание поля маркера CSRF на веб-странице
  • используйте дополнительные поля формы в запросе
  • информация журнала о процессе аутентификации

5. Поддержка OAuth

OAuth технически является фреймворком authorization , и он не определяет никакого механизма аутентификации пользователя.

Тем не менее, он может быть использован в качестве основы для построения протокола аутентификации и идентификации, как в случае OpenID Connect .

5.1. OAuth 2.0

БУДЬТЕ уверены, позволяет настроить маркер доступа OAuth 2.0 для запроса защищенного ресурса:

given().auth()
  .oauth2(accessToken)
  .when()
  .// ...

Библиотека не оказывает никакой помощи в получении маркера доступа, поэтому нам придется выяснить, как это сделать самим.

Для потоков учетных данных и паролей клиента это простая задача, так как Токен получается путем простого представления соответствующих учетных данных.

С другой стороны, автоматизация потока кода авторизации может оказаться не такой простой, и нам, вероятно, понадобится помощь и других инструментов.

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

5.2. OAuth 1.0 a

В случае OAuth 1.0 a REST Assured предоставляет метод, который получает Ключ потребителя, Секрет, Токен доступа и Секрет токена для доступа к защищенному ресурсу:

given().accept(ContentType.JSON)
  .auth()
  .oauth(consumerKey, consumerSecret, accessToken, tokenSecret)
  // ...

Этот протокол требует ввода данных пользователем, поэтому получение последних двух полей не будет тривиальной задачей.

Обратите внимание, что нам нужно будет добавить зависимость scribe java-api в ваш проект, если мы используем функции OAuth 2.0 с версией до 2.5.0 или если мы используем функциональность OAuth 1.0 a.

6. Заключение

В этом руководстве мы узнали, как мы можем пройти аутентификацию для доступа к защищенным API с помощью REST Assured.

Библиотека упрощает процесс аутентификации практически для любой схемы, которую мы реализовали.

Как всегда, мы можем найти рабочие примеры с инструкциями на нашем репозитории Github .