0

Я пытаюсь выполнить запрос запроса REST API, используя org.apache.http.client.HttpClient в версии 4.3.6, но получая ошибку 401. Я использую обычную проверку подлинностиОшибка базовой авторизации HttpClient

Вот мой пример кода

BasicCredentialsProvider credprov = new BasicCredentialsProvider(); 
credprov.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(API_USERNAME, API_PASSWORD)); 

HttpClientBuilder builder = HttpClientBuilder.create().setDefaultCredentialsProvider(credprov); 
HttpClient client = builder.build(); 

HttpGet httpget = new HttpGet(API_TEST_URI); 

HttpResponse response = httpClient.execute(httpget); 
HttpEntity entity = response.getEntity(); 

System.out.println("----------------------------------------"); 
System.out.println(response.getStatusLine()); 
if (entity != null) { 
    System.out.println("Response content length: " + entity.getContentLength()); 
} 
if (entity != null) { 
    entity.consumeContent(); 
} 

httpClient.getConnectionManager().shutdown(); 

Это возвращает 401, даже если все данные верны. Я отлаживал код HttpClient и обнаружил, что исходный ответ возвращает 401, а заголовок WWW-Authenticate просто устанавливается как «Basic» ни с чем другим. Затем это заканчивается исключением MalformedChallengeException. Исключение «Аутентификация является пустым».

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

httpget.addHeader("Authorization", "Basic " + Base64Encoder.encode ("username:password")); 

и это работало (с указанием, что данные аутентификации являются правильными.

Может кто-нибудь найдет какие-либо проблемы с этим подходом и почему он не работает?

+0

вы посмотрите на этот ответ: http://stackoverflow.com/questions/3283234/http-basic-authentication-in-java-using -httpclient? – Tom

+0

да, и именно поэтому я посмотрел на добавление заголовка напрямую. но единственный бит, от которого он связан, указывает, что эта проверка подлинности может не работать для облачных сервисов – user3206236

ответ

0

Похоже, вы добавили учетные данные, но не добавили AuthCache, который требуется для предварительной аутентификации.

Там в example of preemptive basic authentication перечислены на странице примеров HTTPClient: http://hc.apache.org/httpcomponents-client-ga/examples.html

+0

Я пробовал это в то время, и это не сработало. Причина заключалась в том, что не было перехватчика запроса, чтобы добавить аутентификацию из AuthCache. Я в настоящее время не добавляю это, поскольку это невозможно сделать с помощью весеннего xml-инъекции – user3206236