6

Ho un'applicazione che si collega ai siti che richiedono l'autenticazione di base. I siti sono forniti in fase di esecuzione e non sono noti al momento della compilazione.HttpClient 4.2, Autenticazione base e AuthScope

Sto utilizzando HttpClient 4.2.

Non sono sicuro che il codice riportato di seguito sia come devo specificare l'autenticazione di base, ma la documentazione lo suggerirebbe. Tuttavia, non so cosa passare nel costruttore di AuthScope. Avevo pensato che un parametro nullo significasse che le credenziali fornite dovrebbero essere usate per tutti gli URL, ma getta un NullPointerException, quindi chiaramente ho sbagliato.

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 ( nuovo AuthScope (proxyHost, proxyPort), new UsernamePasswordCredentials (proxyUser, proxyPassword)); Questo è il modo corretto – MayurB

risposta

8

AuthScope.ANY è quello che stai dopo: http://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/apache/http/auth/AuthScope.html

Prova questo:

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

Grazie Kieran. Non ho un metodo 'getState' sul client, ma suppongo che stiamo usando solo versioni diverse. Ho provato "AuthScope.ANY" come suggerivo e ha funzionato, grazie. Posso solo farti un'altra domanda - è necessario/consigliato setAuthenticationPreemptive (true)? – user265330

+1

Mi ci è voluto un po 'per vedere questo commento. Il "setAuthenticationPreemptive (true)" significa che i valori di frequenza verranno inviati nella richiesta iniziale senza richiedere prima una richiesta di tentativo senza credenziali e quindi ottenere un 401 e quindi fornirli una volta sfidati. – Kieran

+2

Questi metodi non sono disponibili in HttpClient4.1 – MayurB

2

Da almeno la versione 4.2.3 (Credo che dopo la versione 3.x), il la risposta accettata non è più valida. Invece, fare qualcosa di simile:

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; 
} 

Il JavaDoc per AuthScope.ANY dice Nelle versioni future di HttpClient l'uso di questo parametro sarà interrotto, in modo da utilizzare a proprio rischio. Un'opzione migliore sarebbe utilizzare uno dei costruttori definiti in AuthScope.

Per una discussione su come fare le richieste di preventivo, vedi:

Preemptive Basic authentication with Apache HttpClient 4