Mit Jersey zu bekommen, ein CSRF-token durch RUHE und verwenden Sie es in einem login

Mit Jersey 2.19, Wie bekomme ich ein CSRF-token von einem server verwendet, Spring Security 3 und machen eine erfolgreiche Anmeldung? Ich habe zwei Projekte, ein client, die nutzt REST, und einem server, die erstellt wurde, mithilfe JHipster.

Erste, ich mache ein get-request auf http://localhost:8080 und ich bin immer diese Antwort-Header:

Cache-Control:no-cache, no-store, max-age=0, must-revalidate
Content-Language:en
Content-Length:17229
Content-Type:text/html;charset=utf-8
Date:Tue, 21 Jul 2015 19:24:40 GMT
Expires:0
Last-Modified:Thu, 02 Jul 2015 17:07:31 GMT
Pragma:no-cache
Server:Apache-Coyote/1.1
Set-Cookie:CSRF-TOKEN=0902449b-bac7-43e8-bf24-9ec2c1faa48b; Path=/
X-Application-Context:application:dev:8081
X-Content-Type-Options:nosniff
X-XSS-Protection:1; mode=block

Ich extrahieren Sie die Set-Cookie-header, und ich bekomme das CSRF-token von dort. Dann mache ich eine post-Anfrage so:

http://localhost:8080/api/authentication?j_username=user&j_password=user&submit=Login

Mit diesem request-Header:

Content-Type: application/x-www-form-urlencoded
X-CSRF-TOKEN: <extracted token>

Mit Chrome-plugin Postbote, ich kann einen richtigen post-request für den login, aber mit Jersey, ich bin nicht in der Lage zu senden richtig das CSRF-token (ich bekomme eine 403-Antwort).

Dies ist die Antwort:

{"timestamp":1437507680089,"status":403,"error":"Forbidden","message":"Expected CSRF token not found. Has your session expired?","path":"/api/authentication"}

Dies ist die jersey-code:

WebTarget hostTarget = getClient().target("http://localhost:8080");

Response r = hostTarget.request().get();
String header = r.getHeaderString("Set-Cookie");
String csrf = null;

List<HttpCookie> cookies = HttpCookie.parse(header);

for (HttpCookie c : cookies) {
    if("CSRF-TOKEN".equals(c.getName())){
        csrf = c.getValue();
        break;
    }
}

WebTarget loginTarget = hostTarget.path("/api/authentication");
loginTarget = loginTarget.queryParam("j_username", username)
    .queryParam("j_password", password)
    .queryParam("submit", "Login");

Builder req = loginTarget.request(MediaType.APPLICATION_JSON_TYPE);
if (csrf != null) {
    req = req.header("X-CSRF-TOKEN", csrf);
}

Response cr = req.post(Entity.entity(null,
        MediaType.APPLICATION_FORM_URLENCODED_TYPE));

System.out.println("Response: " + cr.readEntity(String.class));

Vielen Dank für Ihre Zeit.

Haben Sie überprüft während des Sendens durch den Postboten, der CSRF-cookie-token nicht verfügbar ist? Vielleicht ist der Aufruf erfolgreich war, wie ein cookie mit dem token zur Verfügung
Mit Postboten, wenn ich das weglassen der X-CSRF-TOKEN bekomme ich "403 Invalid CSRF Token 'null' wurde gefunden auf request-parameter '_csrf' oder header 'X-CSRF-TOKEN'." Mit _csrf als request-parameter oder die genannten header funktioniert mit Postboten. Dennoch, wenn ich übergehe die CSRF-token, die Nutzung im client-code noch bekomme ich die 403-Antwort in der Frage genannten.

InformationsquelleAutor dovahkiin | 2015-07-21

Schreibe einen Kommentar