Rails не может проверить подлинность токена CSRF после долгого простоя - PullRequest
0 голосов
/ 21 декабря 2018

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

1 Ответ

0 голосов
/ 26 декабря 2018

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

config/initializers/session_store.rb

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

до

config/initializers/session_store.rb

    Lightbulb::Application.config.session_store :cookie_store, key: '_lightbulb_session'
...