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

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

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

 <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.4.1</version>
        </dependency>

以下代码允许设置凭据并使用 Apache HttpClient 连接到我的目标休息服务。 The credentials I am using are correct ,所以我的凭据配置或使用 HTTPClient 的方式肯定有问题。

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

这将返回

HTTP/1.1 401 Unauthorized

我不是摘要身份验证方面的专家,但我知道您必须连接两次,因为服务器首先会向您发送一些身份验证数据。但我相信,当我将 DIGEST 注册为 AuthentificationScheme 时,这应该会自动处理?

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

{digest=org.apache.http.impl.auth.DigestSchemeFactory@481a996b}

这样就注册成功了。

最佳答案

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

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

关于java - Apache HttpClient DigestAuth - 401,未经授权。但凭证没问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29877863/

相关文章:

angularjs: $http 基本认证

java - 如何在 Android 中发送 HTTP 基本身份验证 header ?

java - 如何使用枚举作为接口(interface)中函数声明的参数?

java - 具有自己的存储库接口(interface)的 MongoDB 嵌套对象

java - 如何在 apache HttpClient 上设置 TLS 版本

java - httpcomponents 没有按照文档工作

java - 为什么.Net WebClient无需任何配置就能使用HTTPS,而Java HttpClient却不能

java - 计算测试类中的行数

java - 如何使用我的日志格式简单地创建我自己的自定义控制台记录器?

ruby-on-rails - 如何在 rails 中保护 swagger 页面?