web-dev-qa-db-fra.com

Apache HttpClient 4.1 - Authentification proxy

J'ai essayé de configurer l'utilisateur et le mot de passe pour l'authentification du proxy à partir des propriétés configurées tout en utilisant httpclient d'Apaches HttpComponent, mais sans succès. Tous les exemples que j'ai trouvés font référence à des méthodes et à des classes qui ne sont plus disponibles, telles que HttpState et setProxyCredentials

Alors, quelqu'un peut-il me donner un exemple de la façon de configurer les informations d'identification du proxy?

20
Daniel C. Sobral

Pour Basic-Auth, cela ressemble à ceci:

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 n'est pas pris en charge immédiatement. Mais vous pourrez peut-être gérer cela avec NTCredentials et peut-être surcharger DefaultProxyAuthenticationHandler.

23
nfechner

Pour ceux qui recherchent la réponse pour la version 4.3 ... c'est assez nouveau et leur exemple n'a pas utilisé le nouveau HttpClientBuilder ... c'est pourquoi j'ai implémenté cela dans cette version:

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

Au lieu de NTLM, vous pouvez simplement utiliser les anciens nom d'utilisateur et mot de passe sur 4.3+ httpClient, comme suit: 

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

Comment configurer l'authentification proxy à l'aide du httpclient d'Apache

(Pré-autorisation sur les réseaux proxy)

Cette réponse utilise HttpClient Apache v4.1 et versions ultérieures.

La réponse acceptée n'a pas fonctionné pour moi, mais j'ai trouvé quelque chose d'autre qui a fonctionné! 

Voici du code testé et vérifié d'Apache qui montre comment s'authentifier via un proxy pour une requête HTTP.

La documentation complète se trouve ici: https://hc.Apache.org/httpcomponents-client-ga/tutorial/html/authentication.html

Il existe également un excellent exemple d’Apache ici: https://hc.Apache.org/httpcomponents-client-ga/httpclient/examples/org/Apache/http/examples/client/ClientProxyAuthentication.Java

  • Remplacez my_username par votre nom d'utilisateur proxy
  • Remplacez my_password par votre mot de passe proxy
  • Remplacez proxy.mycompany.com par votre hôte proxy
  • Remplacez 8080 par votre port proxy
  • Remplacez google.com par l'hôte du site auquel vous souhaitez envoyer votre requête HTTP à.
  • Remplacez /some-path par le chemin auquel vous souhaitez envoyer la requête HTTP. Cela utilise le site hôte que vous avez spécifié précédemment (google.com). 

L'exemple suivant authentifiera username:[email protected]:8080 et enverra une demande GET à http://www.google.com/some-path et imprimera le code HTTP de la réponse.

    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

Pour l'authentification HttpClient 4.5 et par demande:

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

Une chose plus simple a fonctionné pour moi pour 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