Заголовок авторизации для проверки подлинности дайджеста Android HttpClient «nc»

1

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

Кажется, что Android HttpClient жестко закодированный заголовок авторизации дайджеста attirbute "nc" до "00000001"?

Любой способ для клиента увеличить это значение при отправке нового запроса? Благодарю.

public class 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));
}

}

  • 0
    Как вы инициализируете свой HttpClient? Опубликовать код
  • 0
    Инициализация очень распространена. Я добавляю пример кода в оригинальный пост. Спасибо
Теги:
httpclient
digest-authentication
nonce

2 ответа

2

Android поставляется с чрезвычайно устаревшей (pre-BETA) вилкой Apache HttpClient. В версии запаса HttpClient произошло огромное количество изменений с 4,0 ALPHA, также в области дайджест-дайджест.

Лучшее, что вы можете сделать, это скопировать DigestScheme из версии запаса Apache HttpClient и настроить приложение на использование копии вместо реализации по умолчанию.

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

Для этого вам придется зарегистрировать собственный экземпляр DigestSchemeFactory с реестром схем auth.

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

  • 0
    Хорошо, что это исправлено. Другой вариант: изменить имя пакета Apache HttpClient с помощью jarjar, упаковать его вместе с приложением и вообще не использовать систему Android.
  • 0
    @Nikolay: Скорее всего, будет повторная версия Apache HttpClient 4.1 для Android, которая должна быть полностью совместимой с API заменой для версии, поставляемой Google.
Показать ещё 2 комментария
0

Кажется, вы правы. Это из 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.

EDIT: поскольку он исправлен в версии запаса, есть еще одна альтернатива:

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню