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 .