У меня есть приложение Rails, и я использую devise с timeoutable
.Если компьютер пользователя некоторое время простаивает (думаю, около часа), я получаю следующие журналы сервера, когда они пытаются войти снова:
Processing by Api::SessionsController#create as JSON
Parameters: {"email"=>"xxx@xxx.xxx", "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!
Я использую гем devise с timeoutable.Это также одностраничное приложение, которое использует Ajax-запросы для доступа к API и куки-файлы сеансов для пользовательских сессий.Но на самом деле я не понимаю, насколько это актуально в любом случае, поскольку любая веб-страница должна была бы каким-либо образом обрабатывать устаревший токен CSRF, и по какой-то причине я не нахожу решение.
Это также, вероятно,Стоит отметить, что изменение timeout_in
на очень короткое, например, 30 секунд, не воспроизводит эту ошибку, равно как и изменение таймера сна компьютера на 1 минуту.Что имеет смысл, учитывая, что срок действия токена CSRF истекает, а не сеанс пользователя.
Ruby v1.9.3
Rails v3.2.8
Devise v3.2.4
Unicorn v4.8.2
Редактировать: Я нашел что-то, что может иметь отношение
session_store.rb
Lightbulb::Application.config.session_store :cookie_store, key: '_lightbulb_session', expire_after: 30.minutes