Жесткий код заголовка авторизации для проверки подлинности дайджеста Android HttpClient - PullRequest
1 голос
/ 23 марта 2012

Мы пытаемся отправить несколько запросов к целевому серверу в одном HttpClient (один сеанс). Целевой сервер сначала аутентифицирует все запросы с помощью дайджест-аутентификации (на основе MD5-sess). Результат показывает, что только первый доступ успешен. Следующие обращения отклоняются сервером, потому что сервер обрабатывает последующие обращения как повторную атаку, поскольку значение «nc» всегда равно «00000001».

Похоже, что Android HttpClient жестко закодирован заголовок авторизации дайджеста от nb до 00000001?

Есть ли способ для клиента увеличить это значение при отправке нового запроса? Спасибо.

открытый класс HttpService {

private static final HttpService instance = new HttpService();
private HttpService() {
    client = getHttpClient();
}

public static HttpService getInstance() {
    return instance;
}

private DefaultHttpClient getHttpClient() {
    HttpParams params = new BasicHttpParams();
    HttpConnectionParams.setStaleCheckingEnabled(params, false);
    HttpConnectionParams.setConnectionTimeout(params, 15 * 1000);
    HttpConnectionParams.setSoTimeout(params, 15 * 1000);
    HttpConnectionParams.setSocketBufferSize(params, 8192);
    HttpProtocolParams.setUserAgent(params, USER_AGENT);

    SchemeRegistry schemeRegistry = new SchemeRegistry();
    Scheme httpScheme = new Scheme("http", PlainSocketFactory.getSocketFactory(), 80);
    Scheme httpsScheme = new Scheme("https", SSLCertificateSocketFactory.getHttpSocketFactory(30 * 1000, null), 443);
    schemeRegistry.register(httpScheme);
    schemeRegistry.register(httpsScheme);
    ClientConnectionManager manager = new ThreadSafeClientConnManager(params, schemeRegistry);

    //create client
    DefaultHttpClient httpClient = new DefaultHttpClient(manager, params);

    httpClient.getCredentialsProvider().setCredentials(new AuthScope(address, port),
                new UsernamePasswordCredentials(username, password));
}

}

Ответы [ 2 ]

2 голосов
/ 23 марта 2012

Android поставляется с крайне устаревшей (до бета-версии) веткой Apache HttpClient.С версии 4.0 ALPHA, также в области аутентификации Digest, произошло бесчисленное количество изменений в стандартной версии HttpClient.

Лучше всего скопировать DigestScheme из стандартной версии Apache HttpClient иСконфигурируйте ваше приложение для использования копии вместо реализации по умолчанию.

http://svn.apache.org/repos/asf/httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/auth/DigestScheme.java

Для этого вам нужно зарегистрировать пользовательский экземпляр DigestSchemeFactory в реестре схемы аутентификации.

http://svn.apache.org/repos/asf/httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/auth/DigestSchemeFactory.java

0 голосов
/ 23 марта 2012

Кажется, ты прав.Это из Digest.java:

//TODO: supply a real nonce-count, currently a server will interprete a repeated request as a replay
private static final String NC = "00000001"; //nonce-count is always 1

Вы должны сообщить об ошибке на http://b.android.com. У вас есть несколько вариантов:

  • вычислить дайджест и создать заголовоксамостоятельно, затем установите его на каждый запрос.Вы можете добавить HttpRequestInterceptor, чтобы сделать это автоматическим (не устанавливайте учетные данные для провайдера учетных данных)
  • Схемы аутентификации AFAIK должны быть подключаемыми, поэтому следует правильно выполнить дайджест-аутентификацию и настроить свой клиент для ее использования.
  • использовать другую клиентскую библиотеку HTTP.

РЕДАКТИРОВАТЬ: поскольку это исправлено в стандартной версии, есть другая альтернатива:

Другая альтернатива:

  • изменить имя пакета Apache HttpClient с помощью jarjar, упакуйте его вместе с приложением и вообще не используйте систему Android.
...