GWT (2.4.0) + XSRF
Я пытался заставить XSRF работать над веб-приложением, но безрезультатно. Я смотрю на типичную реализацию входа в систему.
Я следуюКод Google. I changed my web.xml to include:
<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>
и продленXsrfProtectedServiceServlet
на сервере Impl файл моего сервиса входа в систему. Насколько я понимаю, никаких других изменений на сервере не требуется. Нужно ли добавить что-нибудь еще, например, метод, который возвращаетRpcToken
здесь (а также в интерфейсе, который я реализую)?
На стороне клиента я использую аннотации.
<code>@XsrfProtect @RemoteServiceRelativePath("login") public interface LoginService extends RemoteService { String check(String user, String pass) throws IllegalArgumentExceptionhere; } </code>
Это, вероятно, где я что-то упустил. Google говорит о чаевых:Tip: To specify which RpcToken implementation GWT should generate serializers for use @RpcTokenImplementation annotation.
Не уверен, что это значит, или если мне нужен другой метод для возврата RpcToken.
Мой асинхронный интерфейс выглядит так:
<code>public interface LoginServiceAsync { //Returns the Session ID void check(String user, String pass, AsyncCallback<String> callback); } </code>
Затем для моего реального вызова RPC я обертываю свой код вокруг запроса токена xsrf. Я использую код, идентичный Google:
<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>
Я жалуюсь на то, что вызов getNewXsrfToken не выполняется, так как он не знает, где находится xsrf, из этого вызова:GWT.getModuleBaseURL() + "xsrf"
, У меня такое ощущение, что отсутствует рукопожатие токена, которое вызывает эту ошибку, но я не уверен.
Наконец, я также попытался реализоватьНик Сидеракис & apos; код но его пример использует страницу JSP, которая запрашивает сервер:XsrfTokenUtil.getToken(request.getSession().getId())
, Я не хочу использовать страницы JSP, и я не понял, как это сделать без страницы JSP. Его код также отличается от примера кода Google (т. Е. Он не вызывает getNewXsrfToken), который я не знаю, является ли он "предпочтительным". Google способ борьбы с XSRF.
Есть идеи, что мне не хватает? Благодарю.
EDIT
Решение ниже ...