«1. Обзор

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

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

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

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

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

    basic — это схема, о которой мы поговорим подробнее в следующем разделе. ~~ 3. Базовая аутентификация

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

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

GET / HTTP/1.1
Authorization: Basic dXNlcjpwYXNzd29yZA==

Помните о некоторых предостережениях из RFC 7617: каждый запрос.

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

4. Аутентификация подключения

This scheme is not considered to be a secure method of user authentication unless used in conjunction with some external secure system such as TLS

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

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

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

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

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

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

Затем мы создаем значение заголовка из буквальное «Basic», за которым следуют закодированные учетные данные:

Затем мы вызываем метод setRequestProperty(key, value) для аутентификации запроса. Как упоминалось ранее, мы должны использовать «Authorization» в качестве нашего заголовка и «Basic» + закодированные учетные данные в качестве нашего значения:

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

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

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

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

connection.setRequestProperty("Authorization", authHeaderValue);

5. Java Authenticator

int responseCode = connection.getResponseCode();

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

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

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

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

Authenticator.setDefault(new BasicAuthenticator());

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

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

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

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

«

As always, the code example can be found on GitHub.