web-dev-qa-db-ja.com

Apache HttpClient 4.1-プロキシ認証

Apaches HttpComponentのhttpclientを使用しながら、構成されたプロパティからプロキシ認証のユーザーとパスワードを構成しようとしましたが、成功しませんでした。私が見つけたすべての例は、HttpStatesetProxyCredentialsなど、使用できなくなったメソッドとクラスを参照しています。

だから、誰も私にプロキシ資格情報を設定する方法の例を与えることができますか?

21

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をオーバーロードすることで管理できます。

23
nfechner

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();
37
Hotel

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"));
14
Vishnu

Apacheのhttpclientを使用してプロキシ認証を設定する方法

(プロキシネットワークでの事前承認)

この回答では、ApacheのHttpClient v4.1以降を使用しています。

受け入れられた答えは私にはうまくいきませんでしたが、私は何か他のものを見つけました!

HTTPリクエストのプロキシを介して認証する方法を示す、Apacheからの検証済みのコードを次に示します。

完全なドキュメントは次の場所にあります: 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要求を送信するサイトのホストtoに置き換えます。
  • /some-pathをHTTPリクエストの送信先のパスに置き換えます。これは、以前に指定したホストサイト(google.com)を使用します。

次の例では、username:[email protected]:8080を認証し、http://www.google.com/some-pathGET要求を送信し、応答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();
    }
6
Katie

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);
0
ydrozhdzhal

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);
0
Bhupesh Chawda

コードを4.1で動作させ続ける必要がある場合、または以下のスニペットを使用する場合、httpclient 4.1は認証をプロキシに送信しないことを知っておくことが重要です。 407「Proxy Authentication Required」ステータスコードが表示される可能性があります。 I 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);
0