Apache HttpClient DigestAuth - 401,未经授权。但证书没问题

时间:2015-04-26 12:52:16

标签: java apache-httpclient-4.x http-authentication http-status-code-401 digest-authentication

当我尝试使用DIGEST身份验证连接到网络服务器时,连接将被拒绝(401,未经过身份验证)。我可以找到与此主题相关的答案,其中大部分已弃用,因此我想开始讨论如何使用当前版本解决此问题:

whilt()

以下代码允许使用Apache HttpClient设置凭据并连接到我的目标rest-service。 <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.4.1</version> </dependency> ,因此我的凭据配置或我使用HTTPClient的方式一定有问题。

The credentials I am using are correct

这将返回

    HttpGet getArticles = new HttpGet("http://myurl.xx/api/");

    Registry<AuthSchemeProvider> authSchemeRegistry =
            RegistryBuilder.<AuthSchemeProvider>create().register(AuthSchemes.DIGEST,new DigestSchemeFactory()).build();
    CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
    credentialsProvider.setCredentials(
            new AuthScope("http://myurl.xx/api/",80),
            new UsernamePasswordCredentials(username,pw));

    CloseableHttpClient client = HttpClients.custom()
            .setDefaultAuthSchemeRegistry(authSchemeRegistry)
            .setDefaultCredentialsProvider(credentialsProvider).build();

    try {
        CloseableHttpResponse response = client.execute(getArticles);
        logger.info(String.valueOf(response.getStatusLine().getStatusCode()));
    } catch (IOException e) {
        logger.error(e.getMessage(),e);
    }finally {
        try {
            client.close();
        } catch (IOException e) {
            logger.error(e.getMessage(),e);
        }
    }

我不是digest auth的专家,但我知道你必须连接两次,因为服务器首先会向你发送一些auth数据。但我相信,当我将DIGEST注册为AuthentificationScheme时,应该自动处理?

当我检查客户端时 client.authSchemeRegistry说:

HTTP/1.1 401 Unauthorized

所以它已成功注册。

1 个答案:

答案 0 :(得分:1)

这可能是原因,也可能不是原因,但凭证的范围是错误的。 AuthScope构造函数采用主机名,而不是URL作为第一个参数。

credentialsProvider.setCredentials(
        new AuthScope("myurl.xx",80),
        new UsernamePasswordCredentials(username,pw));