Базовый код аутентификации Base64. HTTP-клиент Apache. - PullRequest
4 голосов
/ 01 декабря 2011

Два связанных вопроса, я использую Apache HTTP Client 4.x API. myHttpPost является экземпляром HttpPost, а myHttpClient является экземпляром HttpClient. Я пытаюсь отправить запрос с использованием обычной аутентификации. Итак, у меня есть HttpClient и я создаю HttpPost.

Способ "грубой силы" установки основного заголовка аутентификации заключается в том, чтобы установить его в заголовке HttpPost.

String encoding = Base64Encoder.encode("username" + ":" + "password");
myHttpPost.setHeader("Authorization", "Basic " + encoding);

Приведенный выше пример возник из другого вопроса переполнения стека (сейчас не могу найти ссылку на него). Относительно класса Base64Encoder - в каком пакете я найду его или откуда я его скачу?

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

myHttpClient.getCredentialsProvider().setCredentials(
    new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT, AuthScope.ANY_REALM, AuthPolicy.BASIC),
    new UsernamePasswordCredentials("username", "password")
);

Но, похоже, это не работает. Итак, является ли первый приведенный выше пример правильным способом выполнения базовой аутентификации с помощью Apache HTTP Client 4.0? Или есть более чистый / простой способ.

Ответы [ 4 ]

4 голосов
/ 01 декабря 2011

По отношению к классу Base64Encoder - какой пакет я найду или где я могу скачать его?

Base64Encoder может прийти из разных мест, я не смог найти что-то, что соответствует вашему статическому encode методу.

Что касается учетных данных, вам нужно установить scheme на Basic на вашем AuthScope, например так:

myHttpClient.getCredentialsProvider().setCredentials(
    new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT, AuthScope.ANY_REALM, "basic"),
    new UsernamePasswordCredentials("username", "password")
);

или

myHttpClient.getCredentialsProvider().setCredentials(
    new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT, AuthScope.ANY_REALM, AuthPolicy.BASIC),
    new UsernamePasswordCredentials("username", "password")
);
2 голосов
/ 10 декабря 2014

Я знаю, что это действительно старый пост.Но я просто хотел ответить, чтобы другие выиграли в будущем:

Если вы используете имя пользователя, которое должно быть представлено в кодировке с переменной шириной (http://en.wikipedia.org/wiki/Variable-width_encoding),, то убедитесь, что вы изменили кодировкуиспользуется для формирования байтов для (имя пользователя: пароль) следующим образом: HttpParams params = new BasicHttpParams (); params.setParameter (AuthPNames.CREDENTIAL_CHARSET, HTTP.UTF_8);

По умолчанию используется кодировка HttpProtocolParams.HTTP_ELEMENT_CHARSET.

1 голос
/ 18 июля 2014

Я опробовал решение, предложенное в http://hc.apache.org/httpcomponents-client-ga/httpclient/examples/org/apache/http/examples/client/ClientPreemptiveBasicAuthentication.java, и оно работает для базовой аутентификации с кодированием Base64.Я думаю, что

 // Create AuthCache instance
 AuthCache authCache = new BasicAuthCache();
 // Generate BASIC scheme object and add it to the local
 // auth cache
 BasicScheme basicAuth = new BasicScheme();
 authCache.put(target, basicAuth);

 // Add AuthCache to the execution context
 HttpClientContext localContext = HttpClientContext.create();
 localContext.setAuthCache(authCache);

творит чудо :) так как без этого я всегда получаю "401 Несанкционированный" ответ HTTP

1 голос
/ 02 декабря 2011

HttpClient не пытается аутентифицироваться на источнике или прокси-сервере , если только явно не оспаривается. Я подозреваю, что вы хотели бы HttpClient для аутентификации с преимуществом. В то время как вытесняющая аутентификация по умолчанию отключена (и я лично не рекомендовал бы использовать ее вне защищенных или внутренних сетей), вы можете принудительно установить опережающую аутентификацию, используя приведенный ниже пример

http://hc.apache.org/httpcomponents-client-ga/httpclient/examples/org/apache/http/examples/client/ClientPreemptiveBasicAuthentication.java

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...