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