2016-08-24 6 views
1

У меня возникли проблемы с внедрением клиента для службы аутентификации с подтверждением http. Используя CURL я могу вызвать службу правильно:Ошибка аутентификации Http с джерси 2.x, работает с curl

curl -v --digest -u "username:password" -H "Content-Type: application/json" --data @entity.json http://<server>:<port>/path 

где entity.json содержит JSON структуру объекта сущности, отправляемый на сервер

Использование Wireshark я вижу след, что HTTP POST отправляется и принимается ответ сервера 401. Будет отправлено новое сообщение с использованием правильной комбинации md5-пароля и т. Д. И будет получено 200 OK с объектом объекта ответа json. Все отлично.

Я попытался осуществить это с помощью джерси 2.x:

import org.glassfish.jersey.client.authentication.HttpAuthenticationFeature; 
import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 

import javax.ws.rs.client.*; 
import javax.ws.rs.core.MediaType; 
import javax.ws.rs.core.Response; 

public class RestApi 
{ 
    private static final Logger log = LoggerFactory.getLogger(RestApi.class) 

    private Client client; 

    private String server; 
    private String username; 
    private String password; 

    public RestApi(String server, String username, String password) { 
    this.server = server; 
    this.username = username; 
    this.password = password; 
    } 

    public Client getClient() { 
    if(this.client == null) { 
     HttpAuthenticationFeature feature = HttpAuthenticationFeature.digest(username, password); 
     this.client = ClientBuilder.newClient(); 
     this.client.register(feature) 
    } 
    return this.client; 
    } 

    public <T> T post(
    final String path, 
    final Object bodyValue, 
    final Class<T> c) throws RestPostException { 
    log.debug("POST path='{}', server='{}', bodyValue='{}'", path, server, bodyValue); 

    WebTarget webTarget = getClient().target(server).path(path); 
    Invocation.Builder invocationBuilder = webTarget.request(MediaType.APPLICATION_JSON_TYPE); 

    Response response = invocationBuilder.post(Entity.entity(bodyValue, MediaType.APPLICATION_JSON_TYPE)); 

    if (response.getStatus() != 200) { 
     String errorString = response.readEntity(String.class); 
     throw new RestPostException(
     "POST failed to '" + server + "/" + path + "' body value: '" + bodyValue + "' : HTTP error code : " + response.getStatus() + 
      ". Error string:" + errorString); 
    } 
    T retval = response.readEntity(c); 
    return retval; 
    } 
} 

Метод пост вызывается из другого класса, как это:

String returnedValue = getRestApi().post(
    path, 
    v, 
    String.class); 

где v это мой объект JSON для отправки в запросе.

Отслеживание этого с помощью wirehark. Я вижу, что POST отправляется (согласно трассировке POST точно соответствует той, которую я посылаю с помощью curl), с несанкционированным ответом 401. Будет отправлено новое сообщение, и я не получу 200 OK. Вместо этого я получаю новый 401 Несанкционированный.

У кого-нибудь есть опыт? Вы видите какие-либо отсутствующие настройки, конфигурацию и т. Д. С тем, как я использую код Java?

ответ

0

Мне не удалось заставить его работать с «HttpAuthenticationFeature.digest».

Но он работает в стандартном порядке клиента apache http. Ниже приведен пример регистрации CredentialsProvider с помощью dropwizard's JerseyClientBuilder:

JerseyClientConfiguration configuration = config.httpClient; 
    HttpHost target = HttpHost.create(config.apiUrl); 
    CredentialsProvider credsProvider = new BasicCredentialsProvider(); 
    credsProvider.setCredentials(new AuthScope(target), new UsernamePasswordCredentials(config.user, config.password)); 

    final Client httpClient = new JerseyClientBuilder(environment) 
      .using(configuration) 
      .using(credsProvider) 
      .build("my-client"); 

 Смежные вопросы

  • Нет связанных вопросов^_^