Упреждающий базовый аут с HttpUrlConnection?
Каков наилучший способ использования предварительной базовой HTTP-аутентификации с использованием HttpUrlConnection. (Предположим, что теперь я не могу использовать HttpClient).
EDIT для пояснения: я правильно устанавливаю un/pw в заголовке запроса с использованием кодировки Base64. Существуют ли какие-либо дополнительные флаги или свойства, которые необходимо установить, или тот факт, что я устанавливаю базовые заголовки заголовков для запроса все, что необходимо для превентивного базового auth?
Ответы
Ответ 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()
и получить байт [], затем построить строку.
Это полностью задело меня, что результаты будут разными для линии, заканчивающейся между этими двумя методами.
Ответ 3
Вы можете использовать java.net.Authenticator для настройки базового auth. глобально для каждого запроса, отправляемого вашим приложением, см.:
Ответ 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/
Я не полностью проверил его, но я использую его для решения базовой проверки подлинности, показанного выше (а также для кодирования/декодирования изображений), и он работает хорошо. Он предоставляет параметр для включения или выключения новой строки.