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

Аутентификация с помощью HttpURLConnection

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

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

1. Обзор

В этом уроке мы рассмотрим, как аутентифицировать HTTP-запросы с помощью класса HttpURLConnection .

2. Аутентификация по протоколу HTTP

В веб-приложениях серверы могут требовать от клиентов проверки подлинности. Несоблюдение этого требования обычно приводит к тому, что сервер возвращает код состояния HTTP 401 (Несанкционированный).

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

Давайте посмотрим на три из них:

  • basic – это схема, о которой мы подробнее расскажем в следующем разделе
  • digest применяет алгоритмы хэширования к учетным данным пользователя и заданному сервером nonce
  • предъявитель использует токены доступа как часть OAuth 2.0

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

Базовая аутентификация позволяет клиентам аутентифицировать себя с помощью закодированного имени пользователя и пароля через заголовок Authorization :

GET / HTTP/1.1
Authorization: Basic dXNlcjpwYXNzd29yZA==

Чтобы создать закодированную строку имени пользователя и пароля, мы просто кодируем имя пользователя Base64, за которым следует двоеточие, а затем пароль:

basic(user, pass) = base64-encode(user + ":" + pass)

Однако помните о некотором предостережении из RFC 7617 :

Эта схема не считается безопасным методом аутентификации пользователя, если она не используется в сочетании с какой-либо внешней защищенной системой, такой как TLS

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

4. Проверка подлинности соединения

Хорошо, с этим в качестве фона, давайте перейдем к настройке HttpURLConnection для использования HTTP Basic.

Класс HttpURLConnection может отправлять запросы, но сначала мы должны получить его экземпляр из объекта URL:

HttpURLConnection connection = (HttpURLConnection) url.openConnection();

Соединение предлагает множество методов для его настройки, таких как setRequestMethod и setRequestProperty.

Как бы странно ни звучал setRequestProperty , это именно то, что нам нужно.

После того, как мы присоединились к имени пользователя и паролю с помощью”:”, мы можем использовать класс java.util.Base64 для кодирования учетных данных:

String auth = user + ":" + password;
byte[] encodedAuth = Base64.encodeBase64(auth.getBytes(StandardCharsets.UTF_8));

Затем мы создаем значение заголовка из литерала “Basic”, за которым следуют закодированные учетные данные:

String authHeaderValue = "Basic " + new String(encodedAuth);

Затем мы вызываем метод setRequestProperty(ключ, значение) для проверки подлинности запроса. Как упоминалось ранее, мы должны использовать “Авторизация” в качестве нашего заголовка и “Основные” + закодированные учетные данные в качестве нашего значения:

connection.setRequestProperty("Authorization", authHeaderValue);

Наконец, нам нужно фактически отправить HTTP-запрос, например, вызвав getResponseCode() . В результате мы получаем код ответа HTTP от сервера:

int responseCode = connection.getResponseCode();

Все в семействе 2xx означает, что ваш запрос, включая часть аутентификации, был в порядке!

5. Аутентификатор Java

Вышеупомянутая базовая реализация аутентификации требует установки заголовка авторизации для каждого запроса. Напротив, абстрактный класс java.net.Аутентификатор позволяет устанавливать аутентификацию глобально для всех подключений .

Сначала нам нужно расширить класс. Затем мы вызываем статический метод Authenticator.setDefault () , чтобы зарегистрировать экземпляр нашего аутентификатора:

Authenticator.setDefault(new BasicAuthenticator());

Наш базовый класс auth просто переопределяет getPasswordAuthentication() неабстрактный метод базового класса:

private final class BasicAuthenticator extends Authenticator {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(user, password.toCharArray());
}
}

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

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

В этом коротком руководстве мы рассмотрели, как применить базовую аутентификацию к запросам, отправленным через HttpURLConnection .

Как всегда, пример кода можно найти на GitHub .