Rails 在长时间闲置后无法验证 CSRF 代币的真实性



我有一个Rails应用程序,我正在使用带有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!

我正在使用具有timeoutable的设计宝石。这也是一个单页应用程序,它使用Ajax请求访问API,并使用用户会话的会话cookie。但我实际上并不认为这有什么关系,因为任何网页都需要能够以某种方式处理过期的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

从此文件中删除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'

相关内容

  • 没有找到相关文章

最新更新