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

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

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

1. Обзор

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

2. HTTP-аутентификация

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

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

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

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

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

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

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(key, value) для аутентификации запроса. Как упоминалось ранее, мы должны использовать «Authorization» в качестве нашего заголовка и «Basic» + закодированные учетные данные в качестве нашего значения:

connection.setRequestProperty("Authorization", authHeaderValue);

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

int responseCode = connection.getResponseCode();

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

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

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

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

Authenticator.setDefault(new BasicAuthenticator());

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

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

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

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

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

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