Преимущественная базовая аутентификация с HttpUrlConnection? - PullRequest
35 голосов
/ 11 августа 2011

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

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

Ответы [ 6 ]

96 голосов
/ 11 августа 2011

Если вы используете 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);

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

2 голосов
/ 05 ноября 2013

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

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

1 голос
/ 09 сентября 2014

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

0 голосов
/ 05 апреля 2018

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

    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();
    }
0 голосов
/ 18 ноября 2015

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

    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);

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

0 голосов
/ 27 марта 2014

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

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

...