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 .