【问题标题】:Devise Session Sign Out Throws 'Invalid Authenticity Token' Exception设计会话注销引发“无效的真实性令牌”异常
【发布时间】:2014-04-18 10:59:59
【问题描述】:

所以在我的 Rails 4.0 应用程序中,我使用 Devise 进行身份验证管理,我注意到当我尝试注销过期会话时出现 500 错误。我不确定问题出在哪里。我看到了许多不同的潜在来源:

1) 我不完全了解如何验证真实性令牌,但我的理解是它来自会话存储中的某些内容。在这种情况下,我的会话存储配置如下:

*config/initializers/session_store.rb*

MyApp::Application.config.session_store ActionDispatch::Session::CacheStore, :expire_after => 20.minutes

当我注销并收到此错误时,20 分钟已经过去,所以我的会话应该在缓存中过期。我不想增加这个数字,但只是为了能够退出我的会话。这似乎没有多大意义。

2) 另一种可能性是在设计的配置中。我正在使用 Devise Timeoutable 模块的默认设置,如下所示。

config/initializers/devise.rb

# ==> Configuration for :timeoutable
# The time you want to timeout the user session without activity. After this
# time the user will be asked for credentials again. Default is 30 minutes.
config.timeout_in = 30.minutes

# If true, expires auth token on session timeout.
config.expire_auth_token_on_timeout = false

我会假设 Devise 足够聪明,可以检查令牌是否已经过期,如果是,就让我通过。否则,它会尝试销毁一个 nil 会话,这同样没有任何意义。

3) 最后的可能性在于设计会话控制器本身。也许我需要这样写:

skip_before_filter :verify_authenticity_token, :only => [:destroy]

我认为这会奏效,但考虑到 Devise 是一个使用得很好的宝石,而且我不能是唯一这样做的人,这对我来说就像是一个 hack。如果我需要这样做,我会假设我做错了什么。

还有其他人遇到过这个问题吗?自从升级到 Rails 4.0(运行设计 3.2.2)后,我才遇到过这个问题。 Rails 3.2 (Running Devise ~> 3.1.0) 没有这个问题。

我主要是想避免我的用户在尝试退出无人参与的会话时看到 Server 500 错误,我正在寻找“正确”的方法来处理它。有什么想法吗?

【问题讨论】:

    标签: ruby-on-rails ruby session ruby-on-rails-4 devise


    【解决方案1】:

    我遇到了同样的问题(但它是在尝试使用 IE 应用程序后才开始的……只是一个案例,但谁知道啊哈哈)。

    我最终在所有表单中添加了一个隐藏字段来创建和销毁会话,因为从那时起我经常遇到这个问题(主要是如果我为我的不同模型创建会话 - 用户和管理员)并且它似乎工作,甚至虽然这对我来说似乎也是一种黑客行为。

    <%= tag(:input, :type => "hidden", :name => request_forgery_protection_token.to_s, :value => form_authenticity_token) %>

    无论如何,我更喜欢这个解决方案,而不是在应用程序控制器中跳过过滤器。还要检查这个问题:Rails 4 Authenticity Token

    希望对你有帮助

    【讨论】:

    • 感谢您的反馈。就我而言,我没有提交表格。我只是调用一个方法类型为 DELETE 的链接。我想我可以将它转换为一种形式,但那是很多开销。从您链接的帖子中,我正在尝试将我的 application_controller.rb 切换为使用protect_from_forgery with: :null_session 而不是:exception。也许这会解决我的问题,但不确定我通过进行更改会在安全方面放弃什么。
    • 理论上改成:null_session应该不是安全问题,但主要是API调用。你应该试一试,因为这是一个非常令人失望的例外。
    • 这样就解决了问题,将其更改为 :null_session 不再导致它抛出真实性令牌异常。
    【解决方案2】:

    添加你的应用控制器

    protect_from_forgery with: :reset_session

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-27
      • 2019-06-20
      • 2018-06-29
      • 1970-01-01
      • 2017-11-10
      • 1970-01-01
      • 2012-07-29
      相关资源
      最近更新 更多