如何使用兼容JAX-RS 2.0的RESTEasy客户端API启用NTLM身份验证?

时间:2019-06-08 15:29:00

标签: authentication client resteasy ntlm

默认情况下,使用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服务之后,我想与回答这个问题。

1 个答案:

答案 0 :(得分:0)

RESTEasy Client API的身份验证由封装的ClientHttpEngine完成。我在此答案中引用的最终版本3.0.19.Final符合JAX-RS 2.0,并附带两种实现。两者都可以进行NTLM身份验证。

使用默认的ApacheHttpClient4Engine

即使它是默认引擎,也需要设置一个自定义实例来提供凭据。首先,必须针对具体的CredentialsCredentialsProvider添加到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
}

使用URLConnectionEngine

此引擎使用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();

资源