У меня есть приложение Rails, и я использую devise с timeoutable
. Если компьютер пользователя какое-то время простаивает (я думаю, около часа), я получаю следующие журналы сервера, когда они пытаются снова войти в систему:
Processing by Api::SessionsController#create as JSON
Parameters: {"email"=>"[email protected]", "password"=>"[FILTERED]"}
WARNING: Can't verify CSRF token authenticity
...
Completed 200 OK in 553ms (Views: 462.6ms | Solr: 0.0ms)
Started GET "/api/home" for ::ffff:150.129.131.50 at 2018-12-20 12:18:51 +0000
Processing by Api::HomeController#show as JSON
Completed 401 Unauthorized in 1ms
Токен CSRF обычно работает нормально, проблема возникает только через час или около того. Это приводит к выходу пользователя из системы, как только он входит в систему. Вот соответствующий код:
application_controller.rb
protect_from_forgery
before_filter :authenticate_user!
application.html.erb
<%= csrf_meta_tags %>
application.js
//= require jquery
//= require jquery_ujs
sessions_controller.rb
skip_before_filter :authenticate_user!
Я использую драгоценный камень разработки с тайм-аутом. Это также одностраничное приложение, которое использует запросы Ajax для доступа к API и файл cookie сеанса для пользовательских сеансов. Но я на самом деле не понимаю, насколько это актуально, поскольку любая веб-страница должна каким-то образом обрабатывать токен CSRF с истекшим сроком действия, и по какой-то причине я не нахожу решения.
Также, вероятно, стоит упомянуть, что изменение timeout_in
на очень короткое, например, 30 секунд, не воспроизводит эту ошибку, как и изменение таймера сна компьютера на 1 минуту. Что имеет смысл, учитывая, что срок действия токена CSRF истекает, а не сеанс пользователя.
Руби v1.9.3
Рельсы v3.2.8
Разработка v3.2.4
Единорог v4.8.2
Редактировать: я нашел кое-что, что может быть актуально
session_store.rb
Lightbulb::Application.config.session_store :cookie_store, key: '_lightbulb_session', expire_after: 30.minutes