По умолчанию отправка запроса с клиентским API RESTEasy на защищенный ресурс, для которого требуется проверка подлинности NTLM, приводит к ответу HTTP со статусом 401 Unauthorized и заголовком WWW-Authenticate: NTLM.
Как включить аутентификацию NTLM с помощью клиентского API RESTEasy и как предоставить учетные данные?
Уже есть связанные вопросы с полезными ответами:
Они несколько устарели (с использованием устаревшего и устаревшего API) и имеют немного другие требования.
После борьбы с задачей использования службы REST веб-API ASP.NET, размещенной в информационных службах Интернета (IIS) из Java с использованием клиентского API RESTEasy, совместимого с JAX-RS 2.0, я хотел бы поделиться своим опытом с обзором в ответ на этот вопрос.





Аутентификация с помощью RESTEasy Client API выполняется инкапсулированным КлиентHttpEngine. Версия 3.0.19.Final, на которую я ссылаюсь в этом ответе, совместима с JAX-RS 2.0 и поставляется с двумя реализациями. Оба могут выполнять аутентификацию NTLM.
Даже если это механизм по умолчанию, вам необходимо настроить собственный экземпляр для предоставления учетных данных. Сначала необходимо добавить Реквизиты для входа к 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, который каким-то образом вызывает Аутентификатор для аутентификации. Чтобы предоставить учетные данные, вы должны переопределить 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();