2012-03-21 7 views
5

Necesito hablar con un servidor web oscuro que requiere autenticación. Si no proporciono las credenciales, se muestra un formulario de inicio de sesión. Sin embargo, si proporciono las credenciales de Autenticación básica no solicitadas, accederé directamente al contenido deseado.Autenticación HTTP con Apache HTTP Componentes: fuerza el envío del desafío

wget apoya de manera directa:

# this fails and downloads a form: 
wget https://weird.egg/data.txt --http-user=me --http-password=shhh 

# this works and downloads the document: 
wget https://weird.egg/data.txt --http-user=me --http-password=shhh --auth-no-challenge 

Ahora mi pregunta: ¿Cómo puedo hacer la descarga en Java utilizando componentes HTTP de Apache?

Esto es lo que obtuve hasta ahora. (También hay un proxy en su lugar, y utilizar -Y on en wget, y tengo un https_proxy variable de entorno a juego.)

import org.apache.http.client.HttpClient; 
import org.apache.http.client.methods.HttpGet; 
import org.apache.http.impl.client.DefaultHttpClient; 
import org.apache.http.conn.params.ConnRoutePNames; 
import org.apache.http.auth.AuthScope; 
import org.apache.http.auth.UsernamePasswordCredentials; 
import java.net.URI; 

// ... 

DefaultHttpClient hc = new DefaultHttpClient(); 
hc.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, new HttpHost(proxy_name, proxy_port)); 

URI uri = new URI("https://weird.egg/data.txt"); 

hc..getCredentialsProvider().setCredentials(new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT, AuthScope.ANY_REALM, AuthScope.ANY_SCHEME), new UsernamePasswordCredentials("me", "shh")); 

hc.execute(new HttpGet(uri)); // etc 

Sin embargo, lo único que termino con la página de formulario de acceso, no el documento actual. Sospecho que DefaultHttpClient no está enviando las credenciales de forma no solicitada, de la forma en que lo hace wget. ¿Hay alguna manera de hacer que el programa Java envíe las credenciales?

Respuesta

10

No importa. He resuelto el problema al no tratar de utilizar ningún método de autenticación de la biblioteca, pero sólo fuerza bruta de la cabecera de autenticación básica en la solicitud:

HttpGet get = new HttpGet(uri); 

String basic_auth = new String(Base64.encodeBase64((username + ":" + password).getBytes())); 
get.addHeader("Authorization", "Basic " + basic_auth); 

hc.execute(get); // etc 

(Esto necesita la import org.apache.commons.codec.binary.Base64; adicional, pero a su vez nos puede quitar el credential- importaciones relacionadas.)

+0

Gran idea, gracias. La solución de marco tampoco funcionó para mí. Añadiendo manualmente el encabezado funcionó. –

+0

Gracias. Tuve el mismo problema con el cliente Maven HTTP Wagon y lo resolví agregando manualmente el encabezado. –

+1

hoy en día solo puede usar 'java.util.Base64.getEncoder(). EncodeToString (algo)', no necesita depender de 'import org.apache.commons.codec.binary.Base64;' – eis

Cuestiones relacionadas