10

próbuję zrobić Digest głównie (Basic) lub uwierzytelniania przy użyciu RestTemplate i httpclient (4.x).RestTemplate podstawowe lub uwierzytelniania szyfrowanego z obecnym httpclient (4.x)

Ponieważ nie mogłem znaleźć żadnych istotnych przykładów tego, jak to zrobić, próbowałem różnych sposobów przechwytywania różnych artefaktów httpclient, bez powodzenia - zasadniczo żaden nagłówek Uwierzytelniania nie jest w ogóle wysyłany.

Moja obecna implementacja jest:

DefaultHttpClient newHttpClient = new DefaultHttpClient(); 
Credentials credentials = new UsernamePasswordCredentials(username, password); 
AuthScope authScope = new AuthScope(host, port, AuthScope.ANY_REALM); 
BasicCredentialsProvider credentialsProvider = new BasicCredentialsProvider(); 
credentialsProvider.setCredentials(authScope, credentials); 
newHttpClient.setCredentialsProvider(credentialsProvider); 

HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(newHttpClient); 
restTemplate.setRequestFactory(requestFactory); 

Czy coś robię źle? Czy istnieje również przykład do tego? Każda pomoc jest doceniana. Dzięki.

+0

Czy można publikować bardziej szczegółowe dzienniki żądań HTTP i odpowiedzi? Przed próbą rozwiązania problemu z kodem klienta przydatne będzie potwierdzenie takich problemów, jak wyzwanie uwierzytelniania. – jtoberon

+1

Mam nadzieję, że nie będzie żadnego wyzwania - chciałbym mieć uwierzytelnianie z wyprzedzeniem. Jeśli chodzi o kod klienta - naprawdę szukam jakiejkolwiek konfiguracji z Spring RestTemplate i HTTPClient (4.x), który działa. – Eugen

Odpowiedz

9

Spróbuj wdrożyć własną aplikację RequestFactory, aby uzyskać uwierzytelnianie z wyprzedzeniem.

public class PreEmptiveAuthHttpRequestFactory extends HttpComponentsClientHttpRequestFactory { 

public PreEmptiveAuthHttpRequestFactory(DefaultHttpClient client) { 
    super(client); 
} 

@Override 
protected HttpContext createHttpContext(HttpMethod httpMethod, URI uri) { 
    AuthCache authCache = new BasicAuthCache(); 
    BasicScheme basicAuth = new BasicScheme(); 
    HttpHost targetHost = new HttpHost(uri.getHost(), uri.getPort()); 
    authCache.put(targetHost, basicAuth); 
    BasicHttpContext localcontext = new BasicHttpContext(); 
    localcontext.setAttribute(ClientContext.AUTH_CACHE, authCache); 

    return localcontext; 
} 
} 

następnie wystarczy użyć go:

HttpComponentsClientHttpRequestFactory requestFactory = new PreEmptiveAuthHttpRequestFactory(newHttpClient); 

Nadzieja pomaga


Jak ustawić nazwę użytkownika i hasło (skopiowane z użytkownika @ bifur komentarzu)

Możesz użyć UserNamePasswordCredentials

UsernamePasswordCredentials credentials = new UsernamePasswordCredentials(getUsername(),getPassword()); 
client.getCredentialsProvider().setCredentials(new AuthScope(getHost(), getPort(), AuthScope.ANY_REALM), credentials); 

I po prostu używać klienta w poprzednim zakładzie

HttpComponentsClientHttpRequestFactory requestFactory = new PreEmptiveAuthHttpRequestFactory(client); 
+0

Daj sobie spokój i dam znać, jak się okazuje - dzięki. – Eugen

+0

Jedna krótka kontynuacja - jak dokładnie ustawiona jest nazwa użytkownika i hasło? – Eugen

+3

Możesz użyć UserNamePasswordCredentials 'UsernamePasswordCredentials poświadczenia = new UsernamePasswordCredentials (getUsername(), getPassword()); . client.getCredentialsProvider() SetCredentials (nowy AuthScope (getHost(), getPort(), AuthScope.ANY_REALM), poświadczenia); ' i po prostu użyć klienta w poprzednim zakładzie ' HttpComponentsClientHttpRequestFactory requestFactory = new PreEmptiveAuthHttpRequestFactory (klient); ' – bifur

0

zmodyfikowałem oryginalny odpowiedź trochę:

  • Dodano obsługę protokołu HTTPS
  • aktualizowane depracated rzeczy

    public class PreEmptiveAuthHttpRequestFactory extends HttpComponentsClientHttpRequestFactory { 
    
        public PreEmptiveAuthHttpRequestFactory(HttpClient client) { 
         super(client); 
        } 
    
        @Override 
        protected HttpContext createHttpContext(HttpMethod httpMethod, URI uri) { 
         AuthCache authCache = new BasicAuthCache(); 
         BasicScheme basicAuth = new BasicScheme(); 
         HttpHost targetHost = new HttpHost(uri.getHost(), uri.getPort(), uri.getScheme()); 
         authCache.put(targetHost, basicAuth); 
         HttpClientContext localContext = HttpClientContext.create(); 
         localContext.setAuthCache(authCache); 
         return localContext; 
        } 
    }