Apache HttpClient обработчик второй ответ 401
Я пытаюсь получить доступ к службе HTTP, которая использует WWW-Authenticate: Negotiate
для аутентификации.
Я использую HttpClient, используя пример из Apache. Я вижу два запроса отправлено. Сначала начальный запрос с ответом 401 и заголовками, указывающими, что WWW-Authenticate: Negotiate
используется (ожидается). Затем отправляется второй запрос с заголовком Authenticate и токеном. Затем сервер отвечает другим 401 и имеет собственный токен аутентификации в заголовке.
Когда я пытаюсь сделать тот же запрос через curl --negotiate
Я вижу то же самое поведение, за исключением того, что curl затем отправляет третий запрос, содержащий модифицированный токен, который в конце концов завершается успешно.
В учебнике Apache есть что сказать об этом:
Если требуется дополнительная обработка, клиенту возвращается другой HTTP 401 с большим количеством данных в заголовке WWW-Authenticate. Клиент берет информацию и генерирует другой токен, передавая его обратно в заголовок авторизации до завершения.
Что подразумевает, что это нормальное явление, которое может случиться, но нет объяснения, что делать, когда это происходит.
Как я могу добиться этого для аутентификации с помощью HttpClient (или если есть другой способ, который проще сделать с другой библиотекой, которую я тоже открываю для этого). Мой код, основанный на примере из HttpClient, приведен ниже.
public class ClientKerberosAuthentication {
public static void main(String[] args) throws Exception {
System.setProperty("java.security.auth.login.config", "login.conf");
System.setProperty("java.security.krb5.conf", "krb5.conf");
System.setProperty("sun.security.spnego.debug", "true");
System.setProperty("javax.security.auth.useSubjectCredsOnly","false");
DefaultHttpClient httpclient = new DefaultHttpClient();
try {
Credentials use_jaas_creds = new Credentials() {
public String getPassword() {
return null;
}
public Principal getUserPrincipal() {
return null;
}
};
httpclient.getCredentialsProvider().setCredentials(
new AuthScope(null, -1, null),
use_jaas_creds);
HttpUriRequest request =
RequestBuilder.post("http://webservice")
.setEntity(EntityBuilder.create().setFile(new File("data.txt")).build())
.build();
HttpResponse response = httpclient.execute(request);
HttpEntity entity = response.getEntity();
System.out.println("----------------------------------------");
System.out.println(response.getStatusLine());
System.out.println("----------------------------------------");
if (entity != null) {
System.out.println(EntityUtils.toString(entity));
}
System.out.println("----------------------------------------");
EntityUtils.consume(entity);
} finally {
httpclient.getConnectionManager().shutdown();
}
}
}