Перейти к содержанию

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

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

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

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

Basic amF2YW1hc3RlcjpIdHRwQ2xpZW50

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

Java HttpClient

В 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, используя шаблон проектирования builder. Метод GET устанавливает HTTP-метод запроса. Метод uri устанавливает URL-адрес, по которому хотели бы отправить запрос.

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

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

INFO ru.javamaster.httpclient.basicauthentication.HttpClientBasicAuthentication - Status 200

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

Использование аутентификатора 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, и клиент будет использовать установленные нами учетные данные. Эта конечная точка принимает имя пользователя «postman» с паролем «password». Добавим аутентификатор в наш клиент:

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

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

Аутентификация с использованием заголовков 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();

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

Заключение

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

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

Оригинал