Rails - 部署后无效的真实性令牌

时间:2009-07-29 17:41:27

标签: ruby-on-rails ruby deployment

我们正在使用EngineYard Cloud来部署我们的Ruby on Rails应用程序。我们正在运行Rails v2.3.3。

EngineYard Cloud以类似于Capistrano的方式部署到AWS实例。每次部署后,我们都会遇到无效的真实性令牌错误。具体而言,任何先前访问过我们的应用程序然后在部署后访问然后尝试提交表单的用户都会收到无效的真实性令牌错误。在重置网站的Cookie之前,此错误仍然存​​在。重置cookie后,该网站按预期工作,没有任何错误。

我们正在使用ActiveRecord的会话存储,会话正在保存到数据库中。

这是我们看到的错误:

  

的ActionController :: InvalidAuthenticityToken     /usr/lib/ruby/gems/1.8/gems/actionpack-2.3.3/lib/action_controller/request_forgery_protection.rb:79:in,check_authenticity_token'

部署后会话对象为零,但会话数据仍然存在于数据库中,会话ID cookie仍然存在:

  

会话:

     
      
  • 会话ID:nil
  •   
  • 数据:nil
  •   

我们无法解释这个。关于什么可能是根本原因的任何想法?

感谢您的任何建议!


编辑:为了更新这一点,我们已经能够找出错误的一个例子。

1)用户加载表单 2)代码在服务器上更新 3)用户提交表格 **发生无效的真实性令牌错误

似乎当环境发生变化时,Rails无法使用真实性令牌处理此问题。

我们已经尝试了几个步骤来解决:

  • 重置会话
  • 删除会话cookie(包括JavaScript和Rails)
  • 部署代码后擦除数据库中的会话表

没有任何作用。唯一有效的方法是让用户在客户端清除他们的cookie。

(我们一直在谷歌搜索(甚至试过Binging!)寻找答案,但没有骰子。这似乎是一个类似的相关问题:http://railsforum.com/viewtopic.php?id=21479

另外:最初我们认为这与我们对EngineYard的部署是隔离的,但我们也能够在我们通过Capistrano部署的开发服务器上重现它。

任何想法都会被感激地接受。

谢谢!

7 个答案:

答案 0 :(得分:13)

答案:经过EngineYard的广泛工作(他们很棒!)他们能够诊断出问题。此问题的根本原因是mongrel集群的错误。 Mongrel在启动后似乎没有看到第一个帖子请求。 EngineYard做了大量工作来诊断这个:

  

您的代码中似乎没有任何内容导致问题,我发现环境之外的人也遇到过该错误(http://www.thought-scope.com/2009/07/mongrelcluster-rails-23x-bad-post.html)。我想很多人都没有看到它,因为对网站的第一次请求通常不是帖子,或者他们将其归结为吸虫。

     

[使用CURL有一个潜在的解决方法。] curl解决方法会对服务器上的每个mongrel做一个简单的GET请求,以便对它们进行填充。您可以使用capistrano执行此操作,但如果您通过仪表板进行部署,则无法执行此操作。您可以在此处找到我们在基础架构中构建的部署挂钩的简短部分:   https://cloud-support.engineyard.com/faqs/overview/getting-started-with-engine-yard-cloud

     

添加简单的运行卷曲http://localhost:500x> / dev / null应该可以工作(其中x是当前设置中5000-50005的端口)。

我们已经通过将我们的堆栈从Mongrel切换到Passenger来解决这个问题,但显然,Mongrel的修复工作正在进行中。希望这可以帮助那些看到同样奇怪问题的人。

答案 1 :(得分:10)

真实性令牌是表单上的隐藏字段,当提交表单时rails检查以确保发布数据来自实时会话。

这是一种安全措施,可以防止恶意用户在其网站上使用表单提交对某人帐户的删除操作。

您可以将整个应用添加到config/environment.rb

,将其关闭
config.action_controller.allow_forgery_protection = false

您可以使用

将其关闭
skip_before_filter :verify_authenticity_token

或将其打开

protect_from_forgery :except => :index

查看ActionController::RequestForgeryProtection::ClassMethods文档了解更多详情

答案 2 :(得分:4)

当您重新部署,使所有现有会话无效时,听起来用于身份验证的密钥会发生变化。

您是否在任何地方设置了配置参数config.action_controller.session,如果这样做,在重新部署时是否有任何可能导致其更改的内容?

我的一个应用程序在config/environment.rb中配置了它,而更新的应用程序(使用Rails 2.3生成)在config/initializers/session_store.rb中设置了它。设置如下:

config.action_controller.session = {
    :secret      => 'long-string-of-hex-digits'
  }

如果由于某种原因没有配置此配置,rake secret将为您生成一个密钥,然后可以将其插入到您的配置中。

(如果是 - 并且它没有被部署过程改变 - 那么我不知道发生了什么。)

答案 3 :(得分:1)

如果它只适用于杂种!我也在乘客身上得到完全相同的错误(用户加载表单,部署,提交 - >无效的真实性令牌)。知道如何通过转换为乘客来解决问题,这很有意思吗?任何进一步的提示都非常受欢迎。我也会仔细看看......

干杯!

答案 4 :(得分:1)

在Rails 2.3和Mongrel群集中遇到同样的问题,其中会话密钥肯定在会话初始化程序中设置。即使在客户端上清除客户端cookie后,问题仍然存在。

然而,在重启之后对所有杂种进行卷曲获取请求的建议似乎有效 - 谢天谢地,有人认为这是因为它看起来非常模糊不清。

我可以提供的唯一添加的信息是我们在Mongrels前面使用Apache mod_proxy_balancer和https,但是在我们打开SSL之前出现了这个问题。是否有人将haproxy视为平衡器而不是Apache?

答案 5 :(得分:1)

这为我解决了这个问题:-) :-): - )

https://rails.lighthouseapp.com/projects/8994-ruby-on-rails/tickets/4690-mongrel-doesnt-work-with-rails-238#ticket-4690-37 Mike Bethany发布 2010年8月30日@ 06:43 PM。

答案 6 :(得分:0)

我从来没有花时间去弄清楚细节,但对我来说,这是一个客户端数据腐烂问题。如果我一直在讨论我存储会话的方式(因此,我的授权细节),我会不时收到此错误。清除私人浏览器数据;饼干,认证会议,作品,总是为我解决。

希望这有帮助。