Подтвердить что ты не робот

Упреждающий базовый аут с HttpUrlConnection?

Каков наилучший способ использования предварительной базовой HTTP-аутентификации с использованием HttpUrlConnection. (Предположим, что теперь я не могу использовать HttpClient).

EDIT для пояснения: я правильно устанавливаю un/pw в заголовке запроса с использованием кодировки Base64. Существуют ли какие-либо дополнительные флаги или свойства, которые необходимо установить, или тот факт, что я устанавливаю базовые заголовки заголовков для запроса все, что необходимо для превентивного базового auth?

4b9b3361

Ответ 1

HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
String encoded = Base64.getEncoder().encodeToString((username+":"+password).getBytes(StandardCharsets.UTF_8));  //Java 8
connection.setRequestProperty("Authorization", "Basic "+encoded);


Затем используйте соединение как обычно.

Если вы используете Java 7 или ниже, вам понадобится метод для кодирования String для Base64, например:

byte[] message = (username+":"+password).getBytes("UTF-8");
String encoded = javax.xml.bind.DatatypeConverter.printBase64Binary(message);

Да, это все, что вам нужно сделать, чтобы использовать Basic Auth. Код, указанный выше, чтобы установить свойство Request, должен быть выполнен сразу после открытия соединения и до получения потоков ввода или вывода.

Ответ 2

Кстати, в случае, если кто-то другой сталкивается с этим, проблема с андроидом также присутствует, если вы используете org.apache.commons.codec.binary.Base64 и делаете Base64.encodeBase64String(). Вам нужно сделать Base64.encodeBase64() и получить байт [], затем построить строку.

Это полностью задело меня, что результаты будут разными для линии, заканчивающейся между этими двумя методами.

Ответ 4

У меня тоже была эта проблема. И теперь я решил эту проблему. Мой код:

    URL url = new URL(stringUrl);

    String authStr = "MyAPIKey"+":"+"Password";
    System.out.println("Original String is " + authStr);

 // encode data on your side using BASE64
    byte[] bytesEncoded = Base64.encodeBase64(authStr .getBytes());
    String authEncoded = new String(bytesEncoded);

    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
    connection.setRequestProperty("Authorization", "Basic "+authEncoded);

Это может помочь многим другим. Удачи.

Ответ 5

Что касается проблемы кодирования Base64, я нашел эту библиотеку: http://sourceforge.net/projects/migbase64/

Я не полностью проверил его, но я использую его для решения базовой проверки подлинности, показанного выше (а также для кодирования/декодирования изображений), и он работает хорошо. Он предоставляет параметр для включения или выключения новой строки.