Мы пытаемся отправить несколько запросов на целевой сервер в один 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));
}
}
Android поставляется с чрезвычайно устаревшей (pre-BETA) вилкой Apache HttpClient. В версии запаса HttpClient произошло огромное количество изменений с 4,0 ALPHA, также в области дайджест-дайджест.
Лучшее, что вы можете сделать, это скопировать DigestScheme из версии запаса Apache HttpClient и настроить приложение на использование копии вместо реализации по умолчанию.
Для этого вам придется зарегистрировать собственный экземпляр DigestSchemeFactory с реестром схем auth.
Кажется, вы правы. Это из 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
чтобы сделать эту автономию (не устанавливайте учетные данные поставщику учетных данных)EDIT: поскольку он исправлен в версии запаса, есть еще одна альтернатива:
Другая альтернатива: