Rails 长时间闲置后无法验证 CSRF 令牌的真实性
Rails can't verify CSRF token authenticity after long idle
我有一个 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!
我正在使用可超时的装置 gem。这也是一个单页应用程序,它使用 Ajax 请求访问 API,以及用户会话的会话 cookie。但我实际上并没有看到这有什么关系,因为任何网页都需要能够以某种方式处理过期的 CSRF 令牌,并且出于某种原因我找不到解决方案。
可能还值得一提的是,将 timeout_in
更改为非常短的时间(例如 30 秒)不会重现此错误,将计算机的睡眠定时器更改为 1 分钟也不会。这是有道理的,因为过期的是 CSRF 令牌,而不是用户会话。
Ruby v1.9.3
Rails 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
从此文件中删除 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'
我有一个 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!
我正在使用可超时的装置 gem。这也是一个单页应用程序,它使用 Ajax 请求访问 API,以及用户会话的会话 cookie。但我实际上并没有看到这有什么关系,因为任何网页都需要能够以某种方式处理过期的 CSRF 令牌,并且出于某种原因我找不到解决方案。
可能还值得一提的是,将 timeout_in
更改为非常短的时间(例如 30 秒)不会重现此错误,将计算机的睡眠定时器更改为 1 分钟也不会。这是有道理的,因为过期的是 CSRF 令牌,而不是用户会话。
Ruby v1.9.3
Rails 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
从此文件中删除 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'