Правильное использование HttpRequestInterceptor и CredentialsProvider при выполнении упреждающей аутентификации с HttpClient - PullRequest
4 голосов
/ 07 мая 2010

Я пишу приложение в 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? Или есть способ сделать это более динамично?

Ответы [ 2 ]

1 голос
/ 07 мая 2010

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

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

0 голосов
/ 07 мая 2010

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

...