I’m doing a singe-page application using Rails. When signing in and out Devise controllers are invoked using ajax. The problem I’m getting is that when I 1) sign in 2) sign out then signing in again doesn’t work.
I think it’s related to CSRF token which gets reset when I sign out (though it shouldn’t afaik) and since it’s single page, the old CSRF token is being sent in xhr request thus resetting the session.
To be more concrete this is the workflow:
- Sign in
- Sign out
- Sign in (successful 201. However prints
WARNING: Can't verify CSRF token authenticityin server logs) - Subsequent ajax request fails 401 unauthorised
- Refresh the website (at this point, CSRF in the page header changes to something else)
- I can sign in, it works, until I try to sign out and in again.
Any clues very much appreciated! Let me know if I can add any more details.
Jimbo did an awesome job explaining the “why” behind the issue you’re running into. There are two approaches you can take to resolve the issue:
(As recommended by Jimbo) Override Devise::SessionsController to return the new csrf-token:
And create a success handler for your sign_out request on the client side (likely needs some tweaks based on your setup, e.g. GET vs DELETE):
This also assumes you’re including the CSRF token automatically with all AJAX requests with something like this:
Much more simply, if it is appropriate for your application, you can simply override the
Devise::SessionsControllerand override the token check withskip_before_filter :verify_authenticity_token.