6

Tengo una aplicación que se conecta a sitios que requieren autenticación básica. Los sitios se proporcionan en tiempo de ejecución y no se conocen en tiempo de compilación.HttpClient 4.2, Autenticación básica y AuthScope

Estoy usando HttpClient 4.2.

No estoy seguro de si el código siguiente es como se supone que debo especificar la autenticación básica, pero la documentación lo sugiere. Sin embargo, no sé qué pasar en el constructor de AuthScope. Pensé que un parámetro nulo significaba que las credenciales suministradas deberían usarse para todas las URL, pero arroja un NullPointerException, así que claramente estoy equivocado.

m_client = new DefaultHttpClient(); 
UsernamePasswordCredentials credentials = new UsernamePasswordCredentials(m_userName, m_password); 
((DefaultHttpClient)m_client).getCredentialsProvider().setCredentials(new AuthScope((HttpHost)null), credentials); 
+0

client.getCredentialsProvider(). setCredentials ( nuevo AuthScope (proxyHost, proxyPort), new UsernamePasswordCredentials (proxyUser, proxyPassword)); Esta es la forma correcta – MayurB

Respuesta

8

AuthScope.ANY es lo que está buscando: http://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/apache/http/auth/AuthScope.html

Prueba esto:

final HttpClient client = new HttpClient(); 
    client.getParams().setAuthenticationPreemptive(true); 
    client.getState().setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(user.getUsername(), user.getPassword())); 
    final GetMethod method = new GetMethod(uri); 
    client.executeMethod(method); 
+1

Gracias Kieran. No tengo un método 'getState' en el cliente, pero supongo que solo estamos usando versiones diferentes. Intenté 'AuthScope.ANY' como sugirió y funcionó, gracias. ¿Puedo hacerte otra pregunta? ¿Es necesario/recomendado el 'setAuthenticationPreemptive (true)'? – user265330

+1

Me tomó un tiempo ver este comentario. El 'setAuthenticationPreemptive (true)' significa que las crendentials se enviarán en la solicitud inicial sin requerir un intento de solicitud primero sin credenciales y luego obtener un 401 y luego proporcionarlas una vez cuestionado. – Kieran

+2

Este método no está disponible en HttpClient4.1 – MayurB

2

Desde al menos la versión 4.2.3 (supongo que después de la versión 3.x), el la respuesta aceptada ya no es válida. En su lugar, hacer algo como:

private HttpClient createClient() { 
    HttpParams params = new BasicHttpParams(); 
    HttpProtocolParams.setContentCharset(params, "UTF-8"); 

    Credentials credentials = new UsernamePasswordCredentials("user", "password"); 
    DefaultHttpClient httpclient = new DefaultHttpClient(params); 
    httpclient.getCredentialsProvider().setCredentials(AuthScope.ANY, credentials); 

    return httpclient; 
} 

el Javadoc para AuthScope.ANY dice En las versiones futuras de HttpClient el uso de este parámetro será descontinuado, a fin de utilizarlo en su propio riesgo. Una mejor opción sería usar uno de los constructores definidos en AuthScope.

Para una discusión sobre cómo hacer peticiones preventivo, ver:

Preemptive Basic authentication with Apache HttpClient 4

Cuestiones relacionadas