设计会话注销会导致无效的真实性令牌'例外

时间:2014-03-13 15:22:33

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

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

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

*配置/初始化/ session_store.rb *

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

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

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

配置/初始化/ 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足够聪明,可以检查令牌是否已经过期,如果是,请通过我。否则,它试图摧毁一个零会话,这也没有任何意义。

3)最后的可能性是在Devise会话控制器本身。也许我需要提出类似的内容:

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

我认为这会起作用,但鉴于Devise是一个使用得很好的宝石而且我不能成为唯一这样做的人,这对我来说就像是一个黑客。如果我需要这样做,我会假设我做错了什么。

还有其他人遇到过这个问题吗?自从升级到Rails 4.0(Running Devise 3.2.2)以来,我才遇到这个问题。我没有使用Rails 3.2(Running Devise~> 3.1.0)来解决这个问题。

我主要只是试图避免我的用户在尝试退出无人值守的会话时看到Server 500错误,并且我正在寻找"正确的"处理它的方法。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

我遇到了同样的问题(但是在尝试使用IE浏览器之后就开始了......只是一个案例,但是谁知道他们)。

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

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

无论如何,我更喜欢这种解决方案来跳过应用程序控制器中的过滤器。还请检查此问题:Rails 4 Authenticity Token

希望有所帮助

答案 1 :(得分:0)

添加您的应用程序控制器

protect_from_forgery with :: reset_session