10

Я пытаюсь сделать проверку подлинности Digest в основном (или Basic) с помощью RestTemplate и HTTPClient (4.x).RestTemplate основной или дайджест аутентификации с текущим HTTPClient (4.x)

Поскольку я не мог найти соответствующие примеры того, как на самом деле сделать это, я попытался различные способы зацепить различные HTTPClient артефакты, не повезло - по существу, нет аутентификации заголовок не отправляется на всех.

Моя текущая реализация:

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

Есть ли что-то я делаю не так? Есть ли для этого рабочий пример? Любая помощь приветствуется. Спасибо.

+0

Опубликовали ли вы более подробные журналы HTTP-запросов и ответов? Было бы полезно подтвердить такие вещи, как проверка подлинности, прежде чем пытаться устранить ваш клиентский код в частности. – jtoberon

+1

Надеюсь, не должно быть никаких проблем - я бы хотел иметь упреждающую аутентификацию. Что касается клиентского кода - я действительно ищу любую установку с Spring RestTemplate и HTTPClient (4.x), которая работает. – Eugen

ответ

9

Попробуйте реализовать свой собственный RequestFactory, чтобы обеспечить превентивную аутентификацию.

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

затем просто использовать:

HttpComponentsClientHttpRequestFactory requestFactory = new PreEmptiveAuthHttpRequestFactory(newHttpClient); 

Надеется, что это помогает


как установить имя пользователя и пароль (скопировано из @ Bifur замечания)

Вы можете использовать UserNamePasswordCredentials

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

И просто использовать клиент в предыдущем заводе

HttpComponentsClientHttpRequestFactory requestFactory = new PreEmptiveAuthHttpRequestFactory(client); 
+0

Я расскажу вам, как получится - спасибо. – Eugen

+0

Одно быстрое наблюдение - как точно указаны имя пользователя и пароль? – Eugen

+3

Вы можете использовать UserNamePasswordCredentials 'UsernamePasswordCredentials credentials = new UsernamePasswordCredentials (getUsername(), getPassword()); . client.getCredentialsProvider() SetCredentials (новый AuthScope (getHost(), getPort(), AuthScope.ANY_REALM), полномочие); ' и просто использовать клиент в предыдущем заводе ' HttpComponentsClientHttpRequestFactory requestFactory = новый PreEmptiveAuthHttpRequestFactory (клиент); ' – bifur

0

Я изменил оригинальный ответ немного:

  • добавляемой Поддержку HTTPS
  • обновленного depracated материал

    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; 
        } 
    } 
    
Смежные вопросы