Apache HttpClient 4.1 - проверка подлинности прокси
Я пытался настроить имя пользователя и пароль для проверки подлинности прокси-сервера из настроенных свойств при использовании httpclient Apache HttpComponent, но безуспешно. Все примеры, которые я нашел, относятся к методам и классам, которые больше не доступны, таким как HttpState
а также setProxyCredentials
,
Итак, кто-нибудь может дать мне пример того, как настроить учетные данные прокси?
6 ответов
Для Basic-Auth это выглядит так:
DefaultHttpClient httpclient = new DefaultHttpClient();
httpclient.getCredentialsProvider().setCredentials(
new AuthScope("PROXY HOST", 8080),
new UsernamePasswordCredentials("username", "password"));
HttpHost targetHost = new HttpHost("TARGET HOST", 443, "https");
HttpHost proxy = new HttpHost("PROXY HOST", 8080);
httpclient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, proxy);
AFAIK NTLM не поддерживается из коробки. Но вы могли бы справиться с этим, используя NTCredentials
и, возможно, перегрузка DefaultProxyAuthenticationHandler
,
Для тех, кто ищет ответ для 4.3... он довольно новый, и его пример не использовал новый HttpClientBuilder... так вот как я реализовал это в этой версии:
NTCredentials ntCreds = new NTCredentials(ntUsername, ntPassword,localMachineName, domainName );
CredentialsProvider credsProvider = new BasicCredentialsProvider();
credsProvider.setCredentials( new AuthScope(proxyHost,proxyPort), ntCreds );
HttpClientBuilder clientBuilder = HttpClientBuilder.create();
clientBuilder.useSystemProperties();
clientBuilder.setProxy(new HttpHost(pxInfo.getProxyURL(), pxInfo.getProxyPort()));
clientBuilder.setDefaultCredentialsProvider(credsProvider);
clientBuilder.setProxyAuthenticationStrategy(new ProxyAuthenticationStrategy());
CloseableHttpClient client = clientBuilder.build();
Вместо NTLM можно использовать просто старое имя пользователя и пароль на 4.3+ httpClient, как показано ниже:
HttpHost proxy = new HttpHost("x.x.com",8080);
Credentials credentials = new UsernamePasswordCredentials("username","password");
AuthScope authScope = new AuthScope("x.x.com", 8080);
CredentialsProvider credsProvider = new BasicCredentialsProvider();
credsProvider.setCredentials(authScope, credentials);
HttpClient client = HttpClientBuilder.create().setProxy(proxy).setDefaultCredentialsProvider(credsProvider).build();
HttpResponse response=client.execute(new HttpGet("http://stackru.com/questions/6962047/apache-httpclient-4-1-proxy-authentication"));
Как настроить проверку подлинности прокси с использованием Apache httpclient
(Предварительная авторизация в прокси-сетях)
Этот ответ использует Apache HttpClient v4.1 и выше.
Принятый ответ не сработал для меня, но я нашел кое-что еще, что сработало!
Вот некоторый проверенный, проверенный код от Apache, который демонстрирует, как проходить аутентификацию через прокси для HTTP-запроса.
Полная документация находится здесь: https://hc.apache.org/httpcomponents-client-ga/tutorial/html/authentication.html.
Здесь также есть отличный пример от Apache: https://hc.apache.org/httpcomponents-client-ga/httpclient/examples/org/apache/http/examples/client/ClientProxyAuthentication.java
- замещать
my_username
с вашим именем прокси - замещать
my_password
с вашим паролем прокси - замещать
proxy.mycompany.com
с вашим прокси-хостом - замещать
8080
с вашим прокси-портом - замещать
google.com
с хостом сайта, на который вы хотите отправить HTTP-запрос. - замещать
/some-path
с путем, по которому вы хотите отправить HTTP-запрос. При этом используется хост-сайт, который вы указали ранее (google.com).
Следующий пример будет аутентифицировать username:password@proxy.mycompany.com:8080
и отправить GET
запросить http://www.google.com/some-path
и напечатает ответный HTTP-код.
CredentialsProvider credsProvider = new BasicCredentialsProvider();
credsProvider.setCredentials(
new AuthScope("proxy.mycompany", 8080),
new UsernamePasswordCredentials("my_username", "my_password"));
CloseableHttpClient httpclient = HttpClients.custom()
.setDefaultCredentialsProvider(credsProvider).build();
try {
//Replace "google.com" with the target host you want to send the request to
HttpHost target = new HttpHost("google.com", 80, "http");
HttpHost proxy = new HttpHost("proxy.mycompany", 8080);
RequestConfig config = RequestConfig.custom()
.setProxy(proxy)
.build();
CloseableHttpResponse response = null;
//Replace "/some-path" with the path you want to send a get request to.
HttpPost httppost = new HttpPost("/some-path");
httppost.setConfig(config);
response = httpclient.execute(target, httppost);
try {
System.out.println("Return status code is "+response.getStatusLine().getStatusCode());
} finally {
response.close();
}
} finally {
httpclient.close();
}
Если вы хотите, чтобы ваш код работал с 4.1, или вы хотите использовать приведенный ниже фрагмент, важно знать, что httpclient 4.1 не будет отправлять аутентификацию прокси. Скорее всего, вы получите код состояния 407 "Требуется проверка подлинности прокси". Я обновил до 4.3.3, и все работало хорошо, хотя DefaultHttpClient и ConnRoutePNames были объявлены устаревшими в этом выпуске. Надеюсь это поможет!
DefaultHttpClient httpclient = new DefaultHttpClient();
httpclient.getCredentialsProvider().setCredentials(
new AuthScope("PROXY HOST", 8080),
new UsernamePasswordCredentials("username", "password"));
HttpHost proxy = new HttpHost("PROXY HOST", 8080);
httpclient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, proxy);
Для NTLM у меня сработала более простая вещь:
httpclient.getCredentialsProvider().setCredentials(
new AuthScope(proxy_host, proxy_port),
new NTCredentials(this.proxy_user, this.proxy_pass, this.proxy_host, this.proxy_domain));
HttpHost proxy = new HttpHost(this.proxy_host, this.proxy_port, "http");
httpclient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, proxy);
Для HttpClient 4.5 и аутентификации по запросу:
HttpContext httpContext = new BasicHttpContext();
AuthState authState = new AuthState();
authState.update(new BasicScheme(), new UsernamePasswordCredentials("userName", "password"));
httpContext.setAttribute(HttpClientContext.PROXY_AUTH_STATE, authState);
CloseableHttpResponse httpResponse = httpClient.execute(httpRequest, httpContext);