我们使用EngineYard Cloud来部署我们的Ruby on Rails应用程序。我们运行的是Rails v2.3.3。
EngineYard Cloud以类似于Capistrano的方式部署到AWS示例。每次部署后,我们都会遇到Invalid Authenticity Token错误。具体来说,任何以前访问过我们的应用程序,然后在部署后访问并尝试提交表单的用户都会收到Invalid Authenticity Token错误。此错误将持续存在,直到他们重置网站的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 `verify_authenticity_token'
部署后session对象为nil,但是,会话数据仍然存在于数据库中,会话ID cookie仍然存在:
会议:
- 会话ID:nil
- 数据:无
我们还没能解释这个。有没有想过根本原因是什么?
感谢您的任何建议!
编辑:只是为了更新这一点,我们已经能够隔离错误的一个例子。
1)用户加载表单2)在服务器上更新代码3)用户提交表单**出现无效的Authenticity Token错误
当环境发生变化时,Rails似乎无法使用authenticity令牌来处理这一点。
我们尝试了几个步骤来解决:
- 重置会话
- 删除会话cookie(JavaScript和Rails中)
- 部署代码后擦除数据库中的会话表
什么都不起作用。唯一起作用的是让用户清除他们的cookie客户端。
(We我一直在谷歌搜索(甚至尝试了Binging!)寻找答案,但没有骰子。这似乎是一个类似的相关问题:http://railsforum.com/viewtopic.php?id=21479)
此外:最初我们认为这是孤立的,我们部署到EngineYard,但我们也能够重现它在我们的开发服务器上,我们部署通过Capistrano。
任何想法都将被感激地接受。
谢谢!
8条答案
按热度按时间xghobddn1#
**ANSWER:**经过EngineYard的大量工作(他们很棒!),他们能够诊断出这个问题。这个问题的根本原因是一个与mongrel集群的bug。Mongrel似乎在启动后没有看到第一个帖子请求。EngineYard做了大量工作来诊断这个问题:
你的代码中似乎没有任何东西导致这个问题,我发现我们环境之外的人也遇到了这个bug(http://www.thought-scope.com/2009/07/mongrelcluster-rails-23x-bad-post.html)。我想很多人没有看到它,因为对一个网站的第一个请求通常不是一个帖子,或者他们把它归咎于侥幸。
[有一个潜在的变通方法使用CURL。] curl变通方法会对服务器上的每个mongrel执行一个简单的GET请求,可以说是对它们进行准备。你可以使用capistrano来做到这一点,但如果你通过 Jmeter 板部署,那就不起作用了。你可以在这里找到一个关于我们在基础设施中构建的部署钩子的简短部分:https://cloud-support.engineyard.com/faqs/overview/getting-started-with-engine-yard-cloud
添加一个简单的run curl〉/dev/null就可以了(其中x是当前设置中的端口5000-50005)。
我们已经通过将我们的堆栈从Mongrel切换到Passenger来解决这个问题,但显然,Mongrel的修复正在进行中。希望这可以帮助看到同样奇怪问题的人。
agyaoht72#
真实性令牌是表单上的一个隐藏字段,当提交表单时,Rails会检查它,以确保发布数据来自实时会话。
它是作为一种安全措施,以防止恶意的人使用一个表单提交他们的网站上说,删除行动对某人的帐户。
您可以通过将此添加到
config/environment.rb
来在整个应用上关闭它您可以使用以下命令关闭单个控制器
或者打开它
查看ActionController::RequestForgeryProtection::ClassMethods文档了解更多细节
92dk7w1h3#
这听起来像是在您重新部署时用于身份验证的密钥发生了更改,从而使所有现有会话无效。
您是否在任何地方设置了配置参数
config.action_controller.session
?如果设置了,在重新部署时,是否有任何东西会导致它发生更改?我的一个应用程序在
config/environment.rb
中配置了它,最近的一个应用程序(使用Rails 2.3生成)在config/initializers/session_store.rb
中设置了它。设置如下所示:如果您出于某种原因没有配置这个,
rake secret
将为您生成一个密钥,然后可以将其插入到您的配置中。(If它是-并且它没有被您的部署过程改变-那么我不知道发生了什么。)
cmssoen24#
如果它只会在那里的杂种!我得到了完全相同的错误乘客以及(用户加载表单,部署,提交-〉无效的真实性令牌).这将是有趣的,知道你是如何解决这个问题切换到乘客?任何进一步的提示是非常欢迎.我会有一个仔细看看,以及...
干杯!
yduiuuwa5#
在Rails2.3和Mongrel集群中遇到过同样的问题,在Mongrel集群中,会话秘密被明确地设置在会话初始化器中。即使在清除客户端上的客户端cookie后,问题仍然出现。
然而,在所有的混合体重新启动后执行curl get请求的建议似乎是可行的--谢天谢地,有人发现了这一点,因为它看起来非常模糊。
我能提供的唯一补充信息是,我们在Mongrels前面使用Apache mod_proxy_balancer沿着https,但是这个问题在我们打开SSL之前就发生了。有人看到haproxy作为平衡器而不是Apache吗?
guicsvcw6#
这为我解决了这个问题:-):-)
https://rails.lighthouseapp.com/projects/8994-ruby-on-rails/tickets/4690-mongrel-doesnt-work-with-rails-238#ticket-4690-37 迈克·贝瑟尼于2010年8月30日下午6时43分发布。
mbzjlibv7#
我从来没有花任何时间去弄清楚细节,但对我来说,这是一个客户端数据腐烂的问题.如果我一直在我存储我的会话(因此,我的授权详细信息)的方式搞砸,我得到这个错误不时.清除私人浏览器数据;cookie,认证会话,工程,一直为我解决它。
希望这能帮上忙。
rryofs0p8#
我可能是太晚了回答这个问题,但仍然写在这里的情况下,任何上述解决方案不工作,尝试检查您的redis服务器安装正确,它的服务工作。
下面是安装和启动redis服务的命令