java proxy apache-httpclient-4.x proxy-authentication

java - Apache HttpClient 4.1-Autenticación Proxy



apache-httpclient-4.x proxy-authentication (6)

Cómo configurar la autenticación proxy usando el cliente http de Apache

(Pre-autorización en redes proxy)

Esta respuesta utiliza HttpClient v4.1 de Apache y posteriores.

La respuesta aceptada no funcionó para mí, ¡pero encontré algo más que sí!

Aquí hay algunos códigos verificados y probados de apache que demuestran cómo autenticarse a través de un proxy para una solicitud HTTP.

La documentación completa se encuentra aquí: https://hc.apache.org/httpcomponents-client-ga/tutorial/html/authentication.html .

También hay un excelente ejemplo de Apache aquí: https://hc.apache.org/httpcomponents-client-ga/httpclient/examples/org/apache/http/examples/client/ClientProxyAuthentication.java

  • Reemplace my_username con su nombre de usuario proxy
  • Reemplace my_password con su contraseña de proxy
  • Reemplace proxy.mycompany.com con su servidor proxy
  • Reemplace 8080 con su puerto proxy
  • Reemplace google.com con el host del sitio al que desea enviar su solicitud HTTP.
  • Reemplace /some-path con la ruta a la que desea enviar la solicitud HTTP. Esto utiliza el sitio host que especificó anteriormente (google.com).

El siguiente ejemplo autenticará el username:[email protected]:8080 y enviará una solicitud GET a http://www.google.com/some-path e imprimirá el código HTTP de la respuesta.

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(); }

He estado tratando de configurar el usuario y la contraseña para la autenticación de proxy de las propiedades configuradas mientras utilizaba el cliente http de Apaches HttpComponent, pero sin éxito. Todos los ejemplos que he encontrado se refieren a métodos y clases que ya no están disponibles, como HttpState y setProxyCredentials .

Entonces, ¿alguien puede darme un ejemplo de cómo configurar las credenciales de proxy?


En lugar de NTLM, se puede usar simplemente el nombre de usuario y la contraseña antiguos en 4.3+ httpClient, de la siguiente manera:

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://.com/questions/6962047/apache-httpclient-4-1-proxy-authentication"));


Para Basic-Auth se ve así:

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 no es compatible de forma inmediata. Pero es posible que pueda administrar eso utilizando NTCredentials y tal vez sobrecargando DefaultProxyAuthenticationHandler .


Para HttpClient 4.5 y por autenticación de solicitud:

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


Para cualquiera que busque la respuesta para 4.3 ... es bastante nuevo y su ejemplo no usó el nuevo HttpClientBuilder ... así es como implementé esto en esa versión:

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


Una cosa más simple me funcionó para 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);