Правильное использование HttpRequestInterceptor и CredentialsProvider при выполнении упреждающей аутентификации с помощью HttpClient

Я пишу приложение на Android, которое использует некоторые созданные мной службы REST. Эти веб-службы не выдают стандартный запрос/ответ Apache Basic. Вместо этого в коде на стороне сервера я хочу запросить имя пользователя и пароль из запроса HTTP (S) и сравнить их с пользователем базы данных, чтобы убедиться, что они могут запустить эту службу.

Я использую HttpClient для этого, и у меня есть учетные данные, сохраненные на клиенте после первоначального входа в систему (по крайней мере, так я вижу, как это работает). Так вот где я застрял. Упреждающая аутентификация в HttpClient требует, чтобы вы установили перехватчик в качестве статического члена. Это пример, который использует Apache Components.

    HttpRequestInterceptor preemptiveAuth = new HttpRequestInterceptor() {
        @Override
        public void process( final HttpRequest request, final HttpContext context) throws HttpException, IOException {
            AuthState authState = (AuthState) context.getAttribute(ClientContext.TARGET_AUTH_STATE);
            CredentialsProvider credsProvider = (CredentialsProvider) context.getAttribute(
                    ClientContext.CREDS_PROVIDER);
            HttpHost targetHost = (HttpHost) context.getAttribute(ExecutionContext.HTTP_TARGET_HOST);

            if (authState.getAuthScheme() == null) {
                AuthScope authScope = new AuthScope(targetHost.getHostName(), targetHost.getPort());
                Credentials creds = credsProvider.getCredentials(authScope);
                if (creds != null) {
                    authState.setAuthScheme(new BasicScheme());
                    authState.setCredentials(creds);
                }
            }
        }
    };

Так что вопрос будет в следующем. Каково было бы правильное использование этого? Буду ли я запускать это как часть приложения при запуске приложения? Извлечь имя пользователя и пароль из памяти, а затем использовать их для создания этого CredentialsProvider, который затем используется HttpRequestInterceptor? Или есть способ сделать это более динамично?


person Preston Crawford    schedule 07.05.2010    source источник


Ответы (2)


HttpClient не очень любит упреждающую аутентификацию.

Если ваш REST API поддерживает BASIC-аутентификацию, то, вероятно, будет проще просто добавить правильный заголовок самостоятельно. Вот пример клиента Twitter, использующий Twitter API, который использует эту технику.

person CommonsWare    schedule 07.05.2010
comment
Я заставил его работать без упреждающей аутентификации. Это оказалось ответом. Спасибо. - person Preston Crawford; 09.05.2010

Ничего, я узнал, что было не так. Я еще раз взглянул на примеры Apache и понял, что не передавал «http» при создании объекта HttpHost, который использовал. Это было совершенно не связано. Фу.

person Preston Crawford    schedule 07.05.2010