HttpClient 4.2, Authentication de bază și AuthScope

Am o aplicație care se conectează la site-uri care necesită autentificare de bază. Site-urile sunt furnizate la momentul executării și nu sunt cunoscute la momentul compilării.

Eu folosesc HttpClient 4.2.

Nu sunt sigur dacă codul de mai jos este modul în care ar trebui să specific de autentificare de bază, dar documentația ar sugera că este. Cu toate acestea, nu știu ce să trec în constructorul AuthScope . M-am gândit că un parametru nul înseamnă că acreditările furnizate ar trebui să fie utilizate pentru toate adresele URL, dar aruncă un NullPointerException , așa că în mod clar greșesc.

m_client = new DefaultHttpClient();
UsernamePasswordCredentials credentials = new UsernamePasswordCredentials(m_userName, m_password);
((DefaultHttpClient)m_client).getCredentialsProvider().setCredentials(new AuthScope((HttpHost)null), credentials);
6
client.getCredentialsProvider (). setCredentials (noul AuthScope (proxyHost, proxyPort), noul UsernamePasswordCredentials (proxyUser, proxyPassword)); Acesta este modul corect
adăugat autor MayurB, sursa

2 răspunsuri

AuthScope.ANY is what you're after: http://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/apache/http/auth/AuthScope.html

Incearca asta:

    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);
8
adăugat
Aceste metode nu sunt disponibile în HttpClient4.1
adăugat autor MayurB, sursa
Mulțumesc Kieran. Nu am o metodă getState pe client, dar cred că folosim doar versiuni diferite. Am încercat AuthScope.ANY așa cum ați sugerat și a funcționat - vă mulțumesc. Pot să vă întreb o altă întrebare - este necesar/recomandat setAuthenticationPreemptive (true) ?
adăugat autor user265330, sursa
Mi-a luat un timp pentru a vedea acest comentariu. setAuthenticationPreemptive (true) înseamnă crendentialele vor fi trimise în cererea inițială fără a solicita mai întâi o solicitare de încercare fără acreditări și apoi obținerea unui 401 și apoi furnizarea acestora odată provocată.
adăugat autor Kieran, sursa

Cel puțin din versiunea 4.2.3 (cred că după versiunea 3.X), răspunsul acceptat nu mai este valabil. În schimb, faceți ceva de genul:

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

JavaDoc pentru AuthScope.ANY spune În versiunile viitoare ale HttpClient utilizarea acestui parametru va fi întreruptă , deci folosiți-o pe propriul risc. O opțiune mai bună ar fi utilizarea unui constructor definit în AuthScope .

Pentru o discuție despre modul în care puteți face cereri de prevenire, consultați:

Autentificare de bază Preemptive cu Apache HttpClient 4

2
adăugat