【问题标题】:Rails can't verify CSRF token authenticity after long idle长时间空闲后,Rails 无法验证 CSRF 令牌的真实性
【发布时间】:2019-05-21 12:59:30
【问题描述】:

我有一个 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

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 csrf-token


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2017-07-15
      • 2015-07-24
      • 2014-06-16
      • 2012-05-08
      • 2015-12-29
      • 2023-03-26
      • 2016-09-17
      • 2012-12-11
      • 2019-07-15
      相关资源
      最近更新 更多