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 .