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?
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
.
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();
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"));
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
my_username
par votre nom d'utilisateur proxymy_password
par votre mot de passe proxyproxy.mycompany.com
par votre hôte proxy8080
par votre port proxygoogle.com
par l'hôte du site auquel vous souhaitez envoyer votre requête HTTP à./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();
}
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);
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);