我有一个使用
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 的工作方式是否发生了变化?我找不到任何表明这一点的发行说明,因为这只是一个小版本更新,这会让我感到惊讶。
尽管如此,事实上它适用于旧版本,但不适用于新版本。有人对我能做什么有什么建议吗?
我花了一些时间尝试让 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;
});
}