Как включить проверку подлинности NTLM с помощью клиентского API RESTEasy, совместимого с JAX-RS 2.0? - PullRequest
0 голосов
/ 08 июня 2019

По умолчанию отправка запроса с клиентским API RESTEasy на защищенный ресурс, для которого требуется аутентификация NTLM, приводит к ответу HTTP со статусом 401 Unauthorized и заголовком WWW-Authenticate: NTLM.

Как включить аутентификацию NTLM с клиентом RESTEasyAPI и как предоставить учетные данные?

Уже есть связанные вопросы с полезными ответами:

Они несколько устарели(с использованием устаревшего и унаследованного API) и предъявляют несколько иные требования.

После решения задачи по использованию службы REST ASP.NET Web API, размещенной в Internet Information Services (IIS) из Java, с использованием JAX-RS 2.0 совместимогоRESTEasy Client API, я хотел бы поделиться своим опытом с обзором в ответ на этот вопросна.

1 Ответ

0 голосов
/ 08 июня 2019

Аутентификация с помощью RESTEasy Client API выполняется инкапсулированным ClientHttpEngine .Версия 3.0.19. Финал, на который я ссылаюсь в этом ответе, совместим с JAX-RS 2.0 и поставляется с двумя реализациями.Оба могут выполнять проверку подлинности NTLM.

Использование по умолчанию ApacheHttpClient4Engine

Даже если это механизм по умолчанию, вам нужно настроить пользовательский экземпляр для предоставления учетных данных.Сначала Учетные данные должны быть добавлены к 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
}

Использование URLConnectionEngine

Этот механизм использует 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();

Ресурсы

...