Перейти к основному содержимому

Базовая аутентификация Java HttpClient

· 4 мин. чтения

1. Обзор

В этом кратком руководстве мы рассмотрим базовую аутентификацию. Мы посмотрим, как это работает, и настроим Java HttpClient для использования такого типа аутентификации.

2. Базовая аутентификация

Базовая аутентификация — это простой метод аутентификации. Клиенты могут аутентифицироваться с помощью имени пользователя и пароля. Эти учетные данные отправляются в HTTP-заголовке авторизации в определенном формате. Он начинается с ключевого слова Basic , за которым следует значение username:password в кодировке base64 . Здесь важен символ двоеточия. Заголовок должен строго следовать этому формату.

Например, для аутентификации с именем пользователя foreach и паролем HttpClient мы должны отправить этот заголовок:

Basic YmFlbGR1bmc6SHR0cENsaWVudA==

Мы можем проверить это, используя декодер base64 и проверив результат декодирования.

3. HTTP-клиент Java

В Java 9 появился новый HttpClient в виде инкубируемого модуля, который был стандартизирован в Java 11. Мы будем использовать Java 11, поэтому мы можем просто импортировать его из пакета java.net.http без каких-либо дополнительных настроек или зависимостей.

Давайте начнем с выполнения простого запроса GET без какой-либо аутентификации:

HttpClient client = HttpClient.newHttpClient();

HttpRequest request = HttpRequest.newBuilder()
.GET()
.uri(new URI("https://postman-echo.com/get"))
.build();

HttpResponse<String> response = client.send(request, BodyHandlers.ofString());

logger.info("Status {}", response.statusCode());

Во- первых, мы создаем HttpClient , который можно использовать для выполнения HTTP-запросов. Во- вторых, мы создаем HttpRequest , используя шаблон проектирования билдера . Метод GET устанавливает HTTP-метод запроса . Метод uri устанавливает URL-адрес , по которому мы хотели бы отправить запрос.

После этого отправляем запрос с помощью нашего клиента. Второй параметр метода send — это обработчик тела ответа . Это сообщает клиенту, что мы хотели бы рассматривать тело ответа как String .

Давайте запустим наше приложение и проверим логи. Вывод должен выглядеть так:

INFO com.foreach.httpclient.basicauthentication.HttpClientBasicAuthentication - Status 200

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

4. Использование аутентификатора HttpClient

Прежде чем мы настроим аутентификацию, нам нужен URL-адрес для ее проверки. Давайте воспользуемся конечной точкой Postman Echo , требующей аутентификации. Во-первых, измените предыдущий URL-адрес на этот и снова запустите приложение:

HttpRequest request = HttpRequest.newBuilder()
.GET()
.uri(new URI("https://postman-echo.com/basic-auth"))
.build();

Давайте проверим журналы и поищем код состояния. На этот раз мы получили HTTP-статус 401 «Unauthorized». Этот код ответа означает, что конечной точке требуется проверка подлинности, но клиент не отправил никаких учетных данных.

Давайте изменим наш клиент, чтобы он отправлял необходимые данные аутентификации. Мы можем сделать это, настроив HttpClient Builder, и наш клиент будет использовать установленные нами учетные данные. Эта конечная точка принимает имя пользователя «почтальон» с паролем «пароль» . Добавим в наш клиент аутентификатор :

HttpClient client = HttpClient.newBuilder()
.authenticator(new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("postman", "password".toCharArray());
}
})
.build();

Давайте снова запустим приложение. Теперь запрос выполнен успешно, и мы получаем HTTP-статус 200.

5. Аутентификация с использованием заголовков HTTP

Мы можем использовать другой подход для доступа к конечным точкам, требующим аутентификации. Из предыдущих разделов мы узнали, как устроен заголовок Authorization , поэтому мы можем установить его значение вручную . Хотя это нужно делать для каждого запроса, а не устанавливать его один раз через аутентификатор.

Давайте удалим аутентификатор и посмотрим, как мы можем установить заголовки запроса. Нам нужно построить значение заголовка, используя кодировку base64 :

private static final String getBasicAuthenticationHeader(String username, String password) {
String valueToEncode = username + ":" + password;
return "Basic " + Base64.getEncoder().encodeToString(valueToEncode.getBytes());
}

Давайте установим это значение для заголовка Authorization и запустим приложение:

HttpRequest request = HttpRequest.newBuilder()
.GET()
.uri(new URI("https://postman-echo.com/basic-auth"))
.header("Authorization", getBasicAuthenticationHeader("postman", "password"))
.build();

Наш запрос выполнен успешно, что означает, что мы правильно построили и установили значение заголовка.

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

В этом кратком руководстве мы увидели, что такое базовая аутентификация и как она работает. Мы использовали Java HttpClient с базовой аутентификацией, установив для него аутентификатор . Мы использовали другой подход для аутентификации, установив заголовок HTTP вручную.

Как всегда, исходный код этих примеров доступен на GitHub .