Android

Preemptive Basic Auth with HttpUrlConnection?

Преимущественная базовая аутентификация с помощью HttpURLConnection?

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

РЕДАКТИРОВАТЬ для пояснения: я правильно устанавливаю un / pw в заголовке запроса, используя кодировку Base64. Существуют ли какие-либо дополнительные флаги или свойства, которые необходимо установить, или тот факт, что я устанавливаю базовые заголовки аутентификации для запроса, является всем, что необходимо для преимущественной базовой аутентификации?

Переведено автоматически
Ответ 1

Если вы используете Java 8 или более поздней версии, java.util.Base64 можно использовать:

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 или ниже, вам понадобится метод для кодирования строки в Base64, например:

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

Да, это все, что вам нужно сделать, чтобы использовать базовую аутентификацию. Приведенный выше код для установки свойства Request следует выполнять сразу после открытия соединения и перед получением входных или выходных потоков.

Ответ 2

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

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

Ответ 3

Вы можете использовать java.net.Аутентификатор для настройки базовой аутентификации. глобально для каждого запроса, отправляемого вашим приложением, см. :

Ответ 4

вам нужно это сделать, просто скопируйте, вставьте и будьте счастливы

    HttpURLConnection urlConnection;
String url;
// String data = json;
String result = null;
try {
String username ="danish.hussain@gmail.com";
String password = "12345678";

String auth =new String(username + ":" + password);
byte[] data1 = auth.getBytes(UTF_8);
String base64 = Base64.encodeToString(data1, Base64.NO_WRAP);
//Connect
urlConnection = (HttpURLConnection) ((new URL(urlBasePath).openConnection()));
urlConnection.setDoOutput(true);
urlConnection.setRequestProperty("Content-Type", "application/json");
urlConnection.setRequestProperty("Authorization", "Basic "+base64);
urlConnection.setRequestProperty("Accept", "application/json");
urlConnection.setRequestMethod("POST");
urlConnection.setConnectTimeout(10000);
urlConnection.connect();
JSONObject obj = new JSONObject();

obj.put("MobileNumber", "+97333746934");
obj.put("EmailAddress", "danish.hussain@dhl.com");
obj.put("FirstName", "Danish");
obj.put("LastName", "Hussain");
obj.put("Country", "BH");
obj.put("Language", "EN");
String data = obj.toString();
//Write
OutputStream outputStream = urlConnection.getOutputStream();
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(outputStream, "UTF-8"));
writer.write(data);
writer.close();
outputStream.close();
int responseCode=urlConnection.getResponseCode();
if (responseCode == HttpsURLConnection.HTTP_OK) {
//Read
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream(), "UTF-8"));

String line = null;
StringBuilder sb = new StringBuilder();

while ((line = bufferedReader.readLine()) != null) {
sb.append(line);
}

bufferedReader.close();
result = sb.toString();

}else {
// return new String("false : "+responseCode);
new String("false : "+responseCode);
}

} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
}
2023-03-07 00:31 java android http