GWT (2.4.0) + XSRF

Ich habe versucht, XSRF vergeblich für eine Webanwendung zum Laufen zu bringen. Ich schaue auf eine typische Login-Implementierung.

Ich folgeGoogles Code. Ich habe meine web.xml so geändert, dass sie Folgendes enthält:

<code><servlet>
    <servlet-name>xsrf</servlet-name>
    <servlet-class>com.google.gwt.user.server.rpc.XsrfTokenServiceServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>xsrf</servlet-name>
    <url-pattern>/gwt/xsrf</url-pattern>
</servlet-mapping>

<context-param>
    <param-name>gwt.xsrf.session_cookie_name</param-name>
    <param-value>JSESSIONID</param-value>
</context-param>
</code>

und verlängertXsrfProtectedServiceServlet auf dem Server Impl-Datei meines Login-Service. Nach meinem Verständnis ist auf dem Server keine weitere Änderung erforderlich. Muss ich noch etwas hinzufügen, z. B. eine Methode, die ein zurückgibt?RpcToken hier (sowie in der Schnittstelle, die ich implementiere)?

Auf der Clientseite verwende ich Anmerkungen.

<code>@XsrfProtect
@RemoteServiceRelativePath("login")
public interface LoginService extends RemoteService {
    String check(String user, String pass) throws IllegalArgumentExceptionhere;
}
</code>

Hier fehlt mir wahrscheinlich etwas. Google sagt zu dem Tipp:Tip: To specify which RpcToken implementation GWT should generate serializers for use @RpcTokenImplementation annotation. Nicht sicher, was das bedeutet oder ob ich hier eine andere Methode benötige, um ein RpcToken zurückzugeben.

Meine asynchrone Schnittstelle sieht folgendermaßen aus:

<code>public interface LoginServiceAsync {
    //Returns the Session ID
    void check(String user, String pass, AsyncCallback<String> callback);
}
</code>

Dann wickle ich für meinen tatsächlichen RPC-Aufruf meinen Code um die xsrf-Token-Anforderung. Ich verwende Code, der mit dem von Google identisch ist:

<code>XsrfTokenServiceAsync xsrf = (XsrfTokenServiceAsync)GWT.create(XsrfTokenService.class);
((ServiceDefTarget)xsrf).setServiceEntryPoint(GWT.getModuleBaseURL() + "xsrf");
xsrf.getNewXsrfToken(new AsyncCallback<XsrfToken>() {

    public void onSuccess(XsrfToken token) {
        LoginServiceAsync rpc = (LoginServiceAsync)GWT.create(LoginService.class);
        ((HasRpcToken) rpc).setRpcToken(token);

        // make XSRF protected RPC call
        rpc.check(user, pass, new AsyncCallback<String>() {
            // ...
        });
    }

    public void onFailure(Throwable caught) {
        try {
             throw caught;
        } catch (RpcTokenException e) {
        // Can be thrown for several reasons:
        //   - duplicate session cookie, which may be a sign of a cookie
        //     overwrite attack
        //   - XSRF token cannot be generated because session cookie isn't
        //     present
        } catch (Throwable e) {
        // unexpected
    }
});
</code>

Die Beschwerde ist, dass der Aufruf von getNewXsrfToken fehlschlägt, da er den xsrf-Speicherort aus dem Aufruf hier nicht kennt:GWT.getModuleBaseURL() + "xsrf". Ich habe das Gefühl, dass ein Token-Handshake fehlt, der diesen Fehler verursacht, bin mir aber nicht sicher.

Zuletzt habe ich auch versucht zu implementierenNick Siderakis 'Code In seinem Beispiel wird jedoch eine JSP-Seite verwendet, auf der der Server gefragt wird:XsrfTokenUtil.getToken(request.getSession().getId()). Ich möchte keine JSP-Seiten verwenden und habe nicht herausgefunden, wie dies ohne eine JSP-Seite durchgeführt werden kann. Sein Code weicht auch vom Google-Codebeispiel ab (d. H. Er nennt getNewXsrfToken nicht), von dem ich nicht weiß, ob es die "bevorzugte" Art von Google ist, mit XSRF umzugehen.

Irgendwelche Ideen, was mir fehlt? Vielen Dank.

BEARBEITEN

Lösung unten ...

Antworten auf die Frage(1)

Ihre Antwort auf die Frage