Apache HTTP 客户端 5.3 ~ NTCredentials 不再工作

问题描述 投票:0回答:1

我有一个使用

org.apache.httpcomponents.client5:httpclient5
的项目。我最近尝试从版本 5.2.3 升级到版本 5.3,却发现身份验证在新版本中不再起作用。

相关代码如下:

        BasicCredentialsProvider credentialsProvider =
            new BasicCredentialsProvider();
        credentialsProvider.setCredentials(
            new AuthScope(host, port),
            new NTCredentials(username, password.toCharArray(), "", "")
        );
        httpclient = HttpClients.custom()
            .setDefaultCredentialsProvider(credentialsProvider)
            .build();
[...]
            final HttpGet httpget = new HttpGet(targetUrl);

            CloseableHttpResponse response = httpclient.execute(httpget);

在从 5.2.3 更新到 5.3 之前,这工作得很好。但是,当我使用 5.3 时,我现在收到 401 UNAUTHORIZED 响应。

我还尝试了上述代码的以下变体来传递凭据,但它们也都只返回 401 UNAUTHORIZED:

        httpclient = HttpClients.custom()
            .setDefaultCredentialsProvider(CredentialsProviderBuilder.create()
                .add(new HttpHost(host, port), username, password.toCharArray())
                .build())
            .build();
        credentialsProvider.setCredentials(
            new AuthScope(host, port),
            new UsernamePasswordCredentials(username, password.toCharArray())
        );
        SystemDefaultCredentialsProvider credentialsProvider =
            new SystemDefaultCredentialsProvider();
        credentialsProvider.setCredentials(
            new AuthScope(host, port),
            new NTCredentials(username, password.toCharArray(), "", "")
        );

现在我被难住了。这可能是 5.3 中的一个错误吗?或者 NTCredentialsProvider 的工作方式是否发生了变化?我找不到任何表明这一点的发行说明,因为这只是一个小版本更新,这会让我感到惊讶。

尽管如此,事实上它适用于旧版本,但不适用于新版本。有人对我能做什么有什么建议吗?

java credentials apache-httpclient-5.x
1个回答
0
投票

我花了一些时间尝试让 Apache Http 客户端使用单点登录和 Windows 集成身份验证对 Tomcat 上运行的 Servlet 进行身份验证,并将华夫饼过滤器配置为使用协商。我的代码过去在 Apache HttpClient 4.5 上运行良好,但在 5.x 上就停止工作了。

System.out.println("Win auth available: " + WinHttpClients.isWinAuthAvailable());
    if (WinHttpClients.isWinAuthAvailable()) {
        ClassicHttpRequest request = new HttpGet("http://localhost:8080/ssotestwebapp/webapp");
        CloseableHttpClient client = WinHttpClients.createDefault();
        HttpClientContext context = HttpClientContext.create();
        
        Collection<String> targetPreferedAuthSchemes = Collections.unmodifiableList(
                Arrays.asList(StandardAuthScheme.KERBEROS, StandardAuthScheme.SPNEGO, StandardAuthScheme.NTLM,
                        StandardAuthScheme.BEARER, StandardAuthScheme.DIGEST, StandardAuthScheme.BASIC));
        RequestConfig config = RequestConfig.custom().setTargetPreferredAuthSchemes(targetPreferedAuthSchemes)
                .build();
        context.setRequestConfig(config);
        
        client.execute(request, context, response -> {
            System.out.println("----------------------------------------");
            System.out.println(new StatusLine(response));
            HttpEntity entity = response.getEntity();
            String s = EntityUtils.toString(entity);
            System.out.println(s);
            EntityUtils.consume(response.getEntity());
            return null;
        });
    }
© www.soinside.com 2019 - 2024. All rights reserved.