Rails не может проверить подлинность токена CSRF после долгого простоя

У меня есть приложение 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

person Wylliam Judd    schedule 21.12.2018    source источник


Ответы (1)


Удаление параметра истечения срока действия через 30 минут из этого файла устранило проблему:

config/initializers/session_store.rb

    Lightbulb::Application.config.session_store :cookie_store, key: '_lightbulb_session', expire_after: 30.minutes

to

config/initializers/session_store.rb

    Lightbulb::Application.config.session_store :cookie_store, key: '_lightbulb_session'
person Wylliam Judd    schedule 26.12.2018