对apache HttpClient 4.3.1使用premitive和proxy身份验证

时间:2013-12-02 08:00:01

标签: authentication apache-httpclient-4.x

我正在尝试连接目标主机,这需要用户名和密码来进行原始身份验证,代理服务器也有自己的主机,用户名和密码。

更新

用例是这样的

我的系统使用代理假设proxy.mydomain.com与互联网连接 我的代理使用身份验证进行连接,并使用用户名和密码进行身份验证

用户名:MyDomain \ myusername 密码:密码

好了,我想要连接的API或服务正在使用抢占式身份验证我有一些代码片段形式的API文档:

final HttpState state = client.getState();
final HttpClientParams params = client.getParams();
myCreds = new UsernamePasswordCredentials(userName, userPassword);
System.out.println("Created credentials for " + myCreds.getUserName());
// Apply the credentials to the httpclient for preemptive authentication.
params.setAuthenticationPreemptive(true);
state.setCredentials(AuthScope.ANY, myCreds);

我尝试了从4.1到4.3的所有apche客户端,但根本没有解决方案。 我可以设置一个凭证但不知道如何将它们设置为HttpClient?

以下是我的代码:

  CloseableHttpResponse response;
  HttpHost myHost=new HttpHost("172.17.8.192", 443, "https");
  CredentialsProvider myServerCredsProvider;     

  if (userName.length() > 0 && userPassword.length() > 0)
    {
        myServerCredsProvider = new BasicCredentialsProvider();  
        myServerCredentials = new UsernamePasswordCredentials(userName, userPassword);

        logger.info("Username : "+userName+" Password : "+userPassword);

        myServerCredsProvider.setCredentials(
            new AuthScope(myHost.getHostName(),myHost.getPort()),
            myServerCredentials);
                        logger.info("After Creds Provider");

        client = HttpClients.custom()
            .setDefaultCredentialsProvider(myServerCredsProvider).build();

    }


    HttpHost proxy = new HttpHost("proxy.mycompany.com", 8080);

    UsernamePasswordCredentials poxyAuthDetails=new UsernamePasswordCredentials("MyDomain//username", "password");

    CredentialsProvider proxyProvider=new BasicCredentialsProvider();

    proxyProvider.setCredentials(new AuthScope(proxy.getHostName(),proxy.getPort()), poxyAuthDetails);

    RequestConfig config = RequestConfig.custom()
            .setProxy(proxy)
            .build();

    HttpGet getServerDetailsUrl=new HttpGet(BaseURI+DominoServerAddress+API_BASE_URI);


    getServerDetailsUrl.setConfig(config);

    try {

        response=client.execute(getServerDetailsUrl);
        try {
            HttpEntity entity = response.getEntity();

            logger.info("----------------------------------------");
            logger.info(response.getStatusLine());

            if (entity != null) {
                logger.info("Response content length: " + entity.getContentLength());
            }
            EntityUtils.consume(entity);

        } finally {
            response.close();
        }

    } catch (IOException ex) {

        isAuthenticate=false;
        logger.info("Exception Occured "+ex.getMessage());

    } 

我在尝试执行时遇到异常:

HTTP / 1.1 407需要代理授权

0 个答案:

没有答案