Conexión a una URL remota que requiere autenticación mediante Java

Resuelto user14128 asked hace 15 años • 12 respuestas

¿Cómo me conecto a una URL remota en Java que requiere autenticación? Estoy tratando de encontrar una manera de modificar el siguiente código para poder proporcionar mediante programación un nombre de usuario/contraseña para que no genere un 401.

URL url = new URL(String.format("http://%s/manager/list", _host + ":8080"));
HttpURLConnection connection = (HttpURLConnection)url.openConnection();
user14128 avatar Jan 31 '09 01:01 user14128
Aceptado

Existe una alternativa nativa y menos intrusiva, que funciona sólo para tu llamada.

URL url = new URL(“location address”);
URLConnection uc = url.openConnection();
String userpass = username + ":" + password;
String basicAuth = "Basic " + new String(Base64.getEncoder().encode(userpass.getBytes()));
uc.setRequestProperty ("Authorization", basicAuth);
InputStream in = uc.getInputStream();
Wanderson Santos avatar Feb 28 '2011 01:02 Wanderson Santos

Puede configurar el autenticador predeterminado para solicitudes http como esta:

Authenticator.setDefault (new Authenticator() {
    protected PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication ("username", "password".toCharArray());
    }
});

Además, si necesita más flexibilidad, puede consultar Apache HttpClient , que le brindará más opciones de autenticación (así como soporte de sesión, etc.)

James Van Huis avatar Jan 30 '2009 18:01 James Van Huis

También puede utilizar lo siguiente, que no requiere el uso de paquetes externos:

URL url = new URL(“location address”);
URLConnection uc = url.openConnection();

String userpass = username + ":" + password;
String basicAuth = "Basic " + javax.xml.bind.DatatypeConverter.printBase64Binary(userpass.getBytes());

uc.setRequestProperty ("Authorization", basicAuth);
InputStream in = uc.getInputStream();
gloo avatar Sep 26 '2012 14:09 gloo

Si está utilizando el inicio de sesión normal mientras ingresa el nombre de usuario y la contraseña entre el protocolo y el dominio, esto es más sencillo. También funciona con y sin inicio de sesión.

URL de muestra: http://usuario: [email protected] /url

URL url = new URL("http://user:[email protected]/url");
URLConnection urlConnection = url.openConnection();

if (url.getUserInfo() != null) {
    String basicAuth = "Basic " + new String(new Base64().encode(url.getUserInfo().getBytes()));
    urlConnection.setRequestProperty("Authorization", basicAuth);
}

InputStream inputStream = urlConnection.getInputStream();

Tenga en cuenta en el comentario, de valerybodak, a continuación cómo se hace en un entorno de desarrollo de Android.

javabeangrinder avatar Oct 29 '2012 13:10 javabeangrinder

Como vine aquí buscando una respuesta de Android-Java, voy a hacer un breve resumen:

  1. Utilice java.net.Authenticator como lo muestra James van Huis
  2. Utilice el cliente HTTP Apache Commons , como en esta respuesta
  3. Utilice java.net.URLConnection básico y configure el encabezado de autenticación manualmente como se muestra aquí

Si desea utilizar java.net.URLConnection con autenticación básica en Android, pruebe este código:

URL url = new URL("http://www.example.com/resource");
URLConnection urlConnection = url.openConnection();
String header = "Basic " + new String(android.util.Base64.encode("user:pass".getBytes(), android.util.Base64.NO_WRAP));
urlConnection.addRequestProperty("Authorization", header);
// go on setting more request headers, reading the response, etc
DaniEll avatar Dec 06 '2014 10:12 DaniEll