2016-08-24 1 views
1

Ich habe Probleme bei der Implementierung eines Clients für eine HTTP Digest authentifizierten Rest Service. Mit ROTATION i bin in der Lage, den Dienst zu rufen richtig:Http Digest Authentifizierung fehlschlägt mit Trikot 2.x, funktioniert mit curl

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

wo entity.json eine JSON-Struktur des Unternehmens Objekt enthält zum Server

Mit wireshark gesendet werden Ich kann die Spur sehen, dass ein HTTP POST wird gesendet, und eine autorisierte Serverantwort 401 wird empfangen. Ein neuer Post, der die richtige Kombination aus md5-Passwort, Nounce usw. verwendet, wird gesendet und ein 200 OK wird mit einem json-Response-Entitätsobjekt empfangen. Alles ist gut.

Ich habe versucht, dies mit Trikot 2.x zu implementieren:

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

wobei v Objekt meiner Json zu senden:

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; 
    } 
} 

Die post-Methode aus einer anderen Klasse wie folgt aufgerufen wird in der Anfrage.

Tracing dies mit wireshark ich sehe, dass der POST gesendet wird (entsprechend der Spur der POST ist genau gleich die, die ich mit curl), mit einer 401 unautorisierten Antwort. Ein neuer Post wird gesendet und ich bekomme keine 200 OK. Stattdessen bekomme ich einen neuen 401 Unauthorized.

Hat jemand Erfahrung damit? Sehen Sie fehlende Einstellungen, Konfiguration usw. mit der Art, wie ich den Java-Code verwende?

Antwort

0

Ich konnte es nicht mit "HttpAuthenticationFeature.digest" funktionieren.

Aber es funktioniert in Standard-Apache HTTP-Client Weg. Unten finden Sie ein Beispiel für die Registrierung von CredentialsProvider mit dem JerseyClientBuilder eines Dropwizards:

Verwandte Themen