部署后无效真伪令牌
我们使用EngineYard Cloud来部署我们的Ruby on Rails应用程序。 我们正在运行Rails v2.3.3。
EngineYard Cloud以类似于Capistrano的方式部署到AWS实例。 每次部署后,我们都会遇到Invalid Authenticity Token错误。 特别是,以前访问过我们的应用程序,然后在部署后访问并尝试提交表单的任何用户都会收到无效的真实性标记错误。 此错误一直存在,直到他们重置其网站的Cookie。 在他们重新设置cookies之后,网站按预期工作,没有任何错误。
我们正在使用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'
会话对象在部署后为零,但会话数据仍然存在于数据库中,会话ID Cookie仍然存在:
会议:
我们一直无法解释这一点。 任何想法可能是根本原因?
感谢您的任何建议!
编辑:只是为了更新这个,我们已经能够隔离错误的一个例子。
1)用户加载表单2)代码在服务器上更新3)用户提交表单**发生无效真实性令牌错误
看起来,当环境发生变化时,Rails无法使用真实性标记处理此问题。
我们已经尝试了几个步骤来解决:
什么都没有 唯一可行的是让用户清除他们的Cookie客户端。
(我们一直在谷歌搜索(甚至尝试Binging!)寻找答案,但没有骰子。这似乎是一个类似的相关问题:http://railsforum.com/viewtopic.php?id=21479)
另外:最初我们认为这对我们部署到EngineYard是孤立的,但我们也能够在我们通过Capistrano部署到的开发服务器上重现它。
任何想法都会被感激地接受。
谢谢!
回答:经过EngineYard的大量工作(他们真棒!)他们能够诊断问题。 这个问题的根本原因是杂种簇的一个错误。 Mongrel在启动后似乎没有看到第一个发布请求。 EngineYard做了大量的工作来诊断这一点:
在你的代码中似乎没有任何东西导致这个问题,并且我发现在我们的环境之外的人也遇到了这个错误(http://www.thought-scope.com/2009/07/mongrelcluster-rails -23x-坏post.html)。 我想很多人都没有看到它,因为对网站的第一次请求通常不是一个帖子,或者他们把它记录下来以防万一。
[使用CURL有一个潜在的解决方法。]卷曲解决方法可以对服务器上的每个mongrels执行一个简单的GET请求,让他们可以这么说。 你可以用capistrano做到这一点,但是如果你通过仪表板进行部署,那么这样做不起作用。 你可以在这里找到关于我们已经构建到基础架构中的部署钩子的简短部分:https://cloud-support.engineyard.com/faqs/overview/getting-started-with-engine-yard-cloud
添加一个简单的运行curl http:// localhost:500x> / dev / null应该可以工作(其中x是您当前安装的5000-50005的端口)。
我们已经通过将我们的堆栈从Mongrel切换到Passenger来解决这个问题,但显然,Mongrel的修复正在进行中。 希望这能帮助看到这个奇怪问题的人。
真实性标记是表单上的一个隐藏字段,当表单提交时,它会检查表单以确保发布的数据来自实时会话。
这是一种安全措施,可以防止恶意人员使用表单在其网站上提交某个帐户的删除操作。
您可以通过将其添加到config/environment.rb
来关闭整个应用程序
config.action_controller.allow_forgery_protection = false
您可以使用一个控制器关闭它
skip_before_filter :verify_authenticity_token
或打开它
protect_from_forgery :except => :index
查看ActionController :: RequestForgeryProtection :: ClassMethods文档了解更多细节
听起来好像用于身份验证的密钥在重新部署时发生了变化,使所有现有会话无效。
你有配置参数config.action_controller.session
设置在任何地方,如果你这样做,有什么会导致它重新部署时改变?
我的一个应用程序在config/environment.rb
中config/environment.rb
它,而最近的一个(使用Rails 2.3生成)在config/initializers/session_store.rb
设置了它。 该设置看起来像:
config.action_controller.session = {
:secret => 'long-string-of-hex-digits'
}
如果您没有为某种原因配置此项,则rake secret
会为您生成一个密钥,然后将其插入到您的配置中。
(如果是这样 - 它不会被你的部署过程改变 - 那么我不知道发生了什么。)
链接地址: http://www.djcxy.com/p/81137.html