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?
Gran idea, gracias. La solución de marco tampoco funcionó para mí. Añadiendo manualmente el encabezado funcionó. –
Gracias. Tuve el mismo problema con el cliente Maven HTTP Wagon y lo resolví agregando manualmente el encabezado. –
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