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.
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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nach viel Versuch und Irrtum, fand ich die Lösung. Ist wichtig, um in Graf-cookies (wie angezeigt von Roman Vottner) für den REST der Konfiguration für die Kommunikation mit spring security. Das wichtige cookie vorhanden sein muss, ist JSESSIONID und der header X-CSRF-TOKEN (oder was auch immer-header-Namen konfiguriert ist, die server), so erfassen Sie in einem ersten Antrag aus und senden Sie Sie erneut.
Habe ich beschlossen, senden Sie alle cookies, die der server auf diese Weise.
InformationsquelleAutor dovahkiin