Аутентификация одного запроса с помощью httpclient 4.x - PullRequest
3 голосов
/ 25 марта 2010

У меня есть экземпляр HttpClient, который используется несколькими потоками. Я хотел бы использовать его, чтобы сделать один запрос с проверкой подлинности. Поскольку только один запрос должен быть аутентифицирован, я не хочу изменять экземпляр HttpClient, как описано в документации . Вот то, что я разработал вместо этого, который не работает. Из того, что я могу сказать, не похоже, что CredentialsProvider используется вообще. Любые советы?

HttpContext context = null;
if(feedSpec.isAuthenticated()) {
  context = new BasicHttpContext();
  CredentialsProvider credsProvider = new BasicCredentialsProvider();
  credsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(feedSpec.getHttpUsername(), feedSpec.getHttpPassword()));
  context.setAttribute(ClientContext.CREDS_PROVIDER, credsProvider);
  context.setAttribute(ClientPNames.HANDLE_AUTHENTICATION, true);
}
HttpGet httpGet = new HttpGet(feedSpec.getUri());
HttpResponse httpResponse = httpClient.execute(httpGet, context);

1 Ответ

3 голосов
/ 26 марта 2010

Оказывается, сервер, к которому я подключался, предлагал только NTLM-аутентификацию. Я реализовал аутентификацию NTLM, используя руководство здесь . Я изменил код, указанный в моем вопросе, чтобы он выглядел так, и он работает:

HttpContext context = null;
if(feedSpec.isAuthenticated()) {
    context = new BasicHttpContext();
    CredentialsProvider credsProvider = new BasicCredentialsProvider();
    credsProvider.setCredentials(AuthScope.ANY, new NTCredentials(feedSpec.getHttpUsername(), feedSpec.getHttpPassword(), "", ""));
    context.setAttribute(ClientContext.CREDS_PROVIDER, credsProvider);
}
HttpGet httpGet = new HttpGet(feedSpec.getUri());
HttpResponse httpResponse = httpClient.execute(httpGet, context);
...