Как обрабатывать HTTP-аутентификацию с использованием HttpURLConnection?

Я пишу Java-клиент, который отправляет на HTTP-сервер, который требует аутентификации.
Я должен поддерживать как минимум следующие три метода аутентификации: Basic, Digest или Negotiate. Кроме того, POST может быть очень большим (более 2 МБ), поэтому мне нужно использовать потоковую передачу. Как задокументировано для HttpURLConnection

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

Итак, мне нужно обработать аутентификацию самостоятельно. Я искал и снова искал способ использования уже закодированных классов - но не нашел пути...

Я мог бы просто взять нужные источники отсюда (так как они GPLv2 с исключением Classpath). Это правильный путь?

Благодарю.

2 ответа

Вам нужен поток вывода? HttpURLConnection наиболее определенно поддерживает аутентификацию с Authenticator Класс, см.: HTTP-аутентификация.

Обновление: если Authenticator это не вариант, вы можете выполнить базовую аутентификацию HTTP вручную, добавив дополнительный заголовок к вашему HTTP-запросу. Попробуйте следующий код (не проверено):

String userPassword = username + ":" + password;
String encoding = new sun.misc.BASE64Encoder().encode(userPassword.getBytes());
URLConnection uc = url.openConnection();
uc.setRequestProperty("Authorization", "Basic " + encoding);
uc.connect();

Связанный с комментарием @Mat:

Вот пример, используемый моей командой и мной:

import org.apache.commons.codec.binary.Base64;

HttpGet getRequest = new HttpGet(endpoint);
getRequest.addHeader("Authorization", "Basic " + getBasicAuthenticationEncoding());

private String getBasicAuthenticationEncoding() {

        String userPassword = username + ":" + password;
        return new String(Base64.encodeBase64(userPassword.getBytes()));
    }

Надеюсь, поможет!

Другие вопросы по тегам