¿Autorización básica preferente con HttpUrlConnection?

¿Cuál es la mejor forma de usar autenticación HTTP básica preventiva usando HttpUrlConnection? (Supongamos por ahora que no puedo usar HttpClient).

EDIT para aclaración: estoy configurando el un / pw correctamente en el encabezado de solicitud usando la encoding Base64. ¿Hay indicadores o propiedades adicionales que deban establecerse, o es el hecho de que estoy configurando los encabezados básicos de autenticación para la solicitud todo lo que se necesita para la autenticación básica preventiva?

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

Luego usa la conexión como siempre.

Si usa Java 7 o una versión anterior, necesitará un método para codificar una Cadena a Base64, como por ejemplo:

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

Sí, eso es todo lo que tienes que hacer para usar Basic Auth. El código anterior para establecer la Propiedad de solicitud se debe hacer inmediatamente después de abrir la conexión y antes de obtener las secuencias de Entrada o Salida.

Por cierto, en caso de que alguien más se encuentre con el mismo problema, también está presente si usa org.apache.commons.codec.binary.Base64 y Base64.encodeBase64String() . Necesitas hacer Base64.encodeBase64() y obtener un byte [] luego construir la cadena.

Me sorprendió por completo que los resultados serían diferentes para la línea que termina entre esos dos métodos.

Puede usar java.net.Authenticator para configurar autenticación básica. globalmente para cada solicitud enviada por su aplicación, consulte:

Yo también estaba teniendo este problema. Y ahora he resuelto este problema. Mi código es:

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

Puede ayudar a muchos otros. La mejor de las suertes.

necesitas hacer esto solo copiar pegarlo ser feliz

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

En cuanto al problema de encoding de Base64, encontré esta biblioteca: http://sourceforge.net/projects/migbase64/

No lo he investigado por completo, pero lo estoy usando para la solución de Autenticación básica que se muestra arriba (así como para la encoding / deencoding de imágenes), y funciona bien. Proporciona un parámetro para incluir o no la nueva línea.