代码之家  ›  专栏  ›  技术社区  ›  Wylliam Judd

长时间空闲后,Rails无法验证CSRF令牌的真实性

  •  1
  • Wylliam Judd  · 技术社区  · 6 年前

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

    我正在使用具有超时功能的Desive gem。这也是一个单页应用程序,它使用Ajax请求访问API,并使用会话cookie访问用户会话。但我并不认为这有什么关系,因为任何网页都需要能够以某种方式处理过期的CSRF令牌,无论出于何种原因,我都找不到解决方案。

    timeout_in 非常短的时间,如30秒,不会重现此错误,也不会将计算机的睡眠计时器更改为1分钟。考虑到到期的是CSRF令牌,而不是用户会话,这是有意义的。

    Ruby v1.9.3

    Rails v3.2.8

    独角兽v4.8.2

    编辑:我发现了一些可能相关的东西

    session_store.rb
    
        Lightbulb::Application.config.session_store :cookie_store, key: '_lightbulb_session', expire_after: 30.minutes
    
    1 回复  |  直到 6 年前
        1
  •  0
  •   Wylliam Judd    6 年前

    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'
    
    推荐文章