2013-10-18 12 views
12

Der folgende Code die Benutzer nicht authentifizieren (kein Authentifizierungsfehler passiert, aber der Aufruf fehlschlägt fehlende Berechtigungen aufgrund):Warum funktioniert HTTPBuilder Basic Auth nicht?

def remote = new HTTPBuilder("http://example.com") 
remote.auth.basic('username', 'password') 
remote.request(POST) { req -> 
    uri.path = "/do-something" 
    uri.query = ['with': "data"] 

    response.success = { resp, json -> 
     json ?: [:] 
    } 
} 

Aber die folgenden funktioniert:

def remote = new HTTPBuilder("http://example.com") 
remote.request(POST) { req -> 
    uri.path = "/do-something" 
    uri.query = ['with': "data"] 
    headers.'Authorization' = 
       "Basic ${"username:password".bytes.encodeBase64().toString()}" 

    response.success = { resp, json -> 
     json ?: [:] 
    } 
} 

Warum isn arbeitet der erste?

+2

Wie funktioniert es nicht? Der Server sollte einen HTTP 401-Statuscode zurückgeben, um die Basisauthentifizierung auszulösen. HttpBuilder sendet dann eine zweite Anfrage mit dem Authorization-Header. – ataylor

+0

Es funktioniert einfach nicht. Die Anfrage selbst kehrt mit einer Nachricht zurück, die besagt, dass der Benutzer keine Berechtigung zum Ausführen der Operation hat. Ich kann den Benutzernamen und das Passwort auf etwas völlig Ungültiges ändern und das Gleiche passiert. –

+2

Dies sollte möglicherweise Ihr Problem lösen http://StackOverflow.com/Questions/6588256/using-groovy-http-builder-in-preemptive-mode –

Antwort

0

Sieht aus wie der Server nicht vollständig HTTPBuilder-compilant ist. Es sollte 401-Code zurückgeben (Standardverhalten für REST-Server, aber nicht Standard für andere), damit HTTPBuilder diesen Status abfangen und die Authentifizierungsanfrage erneut senden kann. Here ist darüber geschrieben.

1

Zwei Dinge, die ich von aus der Spitze von meinem Kopf denken kann.

Die Methode .setHeaders erfordert eine Zuordnung. Haben Sie versucht
'Authorization' : "Basic ${"username:password".bytes.encodeBase64().toString()}"?

Wenn nicht, ist es ein bisschen mehr Arbeit und Code, aber man kann der Benutzer URIBuilder auch. Im Allgemeinen ich zu einer anderen Klasse kapseln

protected final runGetRequest(String endpointPassedIn, RESTClient Client){ 
     URIBuilder myEndpoint = new URIBuilder(new URI(Client.uri.toString() + endpointPassedIn)) 
     HttpResponseDecorator unprocessedResponse = Client.get(uri: myEndpoint) as HttpResponseDecorator 
     def Response = unprocessedResponse.getData() as LazyMap 
     return Response 
} 

hoffe, das hilft