java - example - ¿Autorización básica preferente con HttpUrlConnection?
java restful basic authentication example (6)
¿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 codificación 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?
En cuanto al problema de codificación 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 codificación / decodificación de imágenes), y funciona bien. Proporciona un parámetro para incluir o no la nueva línea.
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 ="[email protected]";
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", "[email protected]");
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();
}
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.