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

0 ответов

Другие вопросы по тегам