Apache HttpClient 4.1 - Прокси-аутентификация

Я пытаюсь настроить пользователя и пароль для прокси-аутентификации из настроенных свойств при использовании Apache HttpComponent httpclient, но без успеха. Все примеры, которые я нашел, относятся к методам и классам, которые больше недоступны, например HttpState и setProxyCredentials.

Итак, может ли кто-нибудь дать мне пример настройки учетных данных прокси?

Ответы

Ответ 1

Для 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.

Ответ 2

Для тех, кто ищет ответ для 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();

Ответ 3

Вместо 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://stackoverflow.com/questions/6962047/apache-httpclient-4-1-proxy-authentication"));

Ответ 4

Как настроить проверку подлинности прокси с использованием 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:[email protected]: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();
    }

Ответ 5

Простая работа для меня для 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);

Ответ 6

Для 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);

Ответ 7

Если вы хотите, чтобы ваш код работал с 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);