wake-up-neo.net

Apache HttpClient 4.1 - Proxy-Authentifizierung

Ich habe versucht, den Benutzer und das Kennwort für die Proxy-Authentifizierung aus den konfigurierten Eigenschaften zu konfigurieren, während der HTTP-Client von Apaches HttpComponent verwendet wird. Alle Beispiele, die ich gefunden habe, beziehen sich auf Methoden und Klassen, die nicht mehr verfügbar sind, wie HttpState und setProxyCredentials

Kann mir jemand ein Beispiel geben, wie die Proxy-Anmeldeinformationen konfiguriert werden?

20

Für Basic-Auth sieht es so aus:

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 wird nicht standardmäßig unterstützt. Möglicherweise können Sie dies jedoch mit NTCredentials und möglicherweise mit DefaultProxyAuthenticationHandler verwalten.

23
nfechner

Für alle, die nach der Antwort für 4.3 suchen ... es ist ziemlich neu und ihr Beispiel hat den neuen HttpClientBuilder nicht verwendet ... also habe ich dies in dieser Version implementiert:

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

Anstelle von NTLM können Sie auf 4.3+ httpClient einfach den alten Benutzernamen und das Kennwort wie folgt verwenden: 

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

So richten Sie die Proxy-Authentifizierung mit dem HTTP-Client von Apache ein

(Vorautorisierung in Proxy-Netzwerken)

Diese Antwort verwendet den HttpClient von Apache v4.1 und höher.

Die akzeptierte Antwort hat für mich nicht funktioniert, aber ich habe etwas anderes gefunden, das funktioniert hat! 

Hier ein paar getestete, überprüfte Codes von Apache, die zeigen, wie Sie sich über einen Proxy für eine HTTP-Anforderung authentifizieren.

Die vollständige Dokumentation finden Sie hier: https://hc.Apache.org/httpcomponents-client-ga/tutorial/html/authentication.html

Es gibt auch ein hervorragendes Beispiel von Apache hier: https://hc.Apache.org/httpcomponents-client-ga/httpclient/examples/org/Apache/http/examples/client/ClientProxyAuthentication.Java

  • Ersetzen Sie my_username durch Ihren Proxy-Benutzernamen
  • Ersetzen Sie my_password durch Ihr Proxy-Passwort
  • Ersetzen Sie proxy.mycompany.com durch Ihren Proxy-Host
  • Ersetzen Sie 8080 durch Ihren Proxy-Port
  • Ersetzen Sie google.com durch den Host der Site, an die Sie Ihre HTTP-Anforderung an senden möchten.
  • Ersetzen Sie /some-path durch den Pfad, an den Sie die HTTP-Anforderung senden möchten. Hierbei wird die zuvor von Ihnen angegebene Host-Site (google.com) verwendet. 

Das folgende Beispiel authentifiziert username:[email protected]:8080 und sendet eine GET-Anforderung an http://www.google.com/some-path und gibt den Antwort-HTTP-Code aus.

    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
Katie S

Für HttpClient 4.5 und Authentifizierung pro Anforderung:

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

Eine einfachere Sache hat für mich bei NTLM funktioniert:

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

Wenn Sie Ihren Code weiterhin mit 4.1 verwenden müssen oder das folgende Snippet verwenden möchten, ist es wichtig zu wissen, dass httpclient 4.1 die Authentifizierung nicht an den Proxy sendet. Wahrscheinlich erhalten Sie den Statuscode 407 "Proxy-Authentifizierung erforderlich". Ich auf 4.3.3 aktualisiert und alle haben gut funktioniert, obwohl DefaultHttpClient und ConnRoutePNames in dieser Version veraltet waren. Hoffe das hilft!

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