默认情况下,使用RESTEasy客户端API向要求NTLM身份验证的安全资源发送请求会导致HTTP响应,其状态为401 Unauthorized
和标头WWW-Authenticate: NTLM
。
如何使用RESTEasy客户端API启用NTLM身份验证以及如何提供凭据?
已经有相关问题,提供了有用的答案:
它们有些过时了(使用不推荐使用的和旧式API),并且要求略有不同。
在努力使用Java兼容JAX-RS 2.0的RESTEasy Client API消耗Java托管在Internet信息服务(IIS)上的ASP.NET Web API REST服务之后,我想与回答这个问题。
答案 0 :(得分:0)
RESTEasy Client API的身份验证由封装的ClientHttpEngine完成。我在此答案中引用的最终版本3.0.19.Final符合JAX-RS 2.0,并附带两种实现。两者都可以进行NTLM身份验证。
即使它是默认引擎,也需要设置一个自定义实例来提供凭据。首先,必须针对具体的Credentials将CredentialsProvider添加到AuthScope中。下一步是将它们设置在HttpClientContext上,然后再次需要将其提供给引擎。
Credentials credentials = new NTCredentials("user", "password", "workstation", "domain");
CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(
new AuthScope(null, AuthScope.ANY_PORT, AuthScope.ANY_REALM, AuthSchemes.NTLM)
, credentials
);
HttpClientContext httpContext = HttpClientContext.create();
httpContext.setCredentialsProvider(credentialsProvider);
try (CloseableHttpClient httpClient = HttpClientBuilder.create().build();) {
ApacheHttpClient4Engine engine = new ApacheHttpClient4Engine(httpClient, httpContext);
ResteasyClient client = new ResteasyClientBuilder().httpEngine(engine).build();
// work with the client
}
此引擎使用HttpURLConnection,它以某种方式调用Authenticator进行身份验证。要提供凭据,您必须在自定义子类中覆盖getPasswordAuthentication并将其注册为默认值。
public class NTLMAuthenticator extends Authenticator {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("domain\\user", "password".toCharArray());
}
}
Authenticator.setDefault(new NTLMAuthenticator());
ResteasyClient client =
new ResteasyClientBuilder().httpEngine(new URLConnectionEngine()).build();
// work with the client
client.close();