«1. Обзор

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

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

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

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

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

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

REST Assured предоставляет простой способ настройки учетных данных, которые требуются для запроса:

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 ожидает запроса сервера перед отправкой учетных данных.

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

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

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

С ее помощью REST Assured отправит учетные данные, не дожидаясь ответа Unauthorized.

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

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

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

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

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

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

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

4. Использование аутентификации с помощью формы

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

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

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

Если форма входа достаточно проста и соответствует этим правилам, то мы можем положиться на REST Assured, чтобы вычислить эти значения для нас:

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

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

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

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

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

Помимо этих базовых конфигураций, REST Assured поставляется с функциями, позволяющими:

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

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

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

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

5.1. OAuth 2.0

REST Assured позволяет настроить токен доступа OAuth 2.0 для запроса защищенного ресурса:

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

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

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

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

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

5.2. OAuth 1.0a

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

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

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

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

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

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

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

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