【发布时间】:2010-11-15 04:08:23
【问题描述】:
我们正在使用 EngineYard Cloud 来部署我们的 Ruby on Rails 应用程序。我们正在运行 Rails v2.3.3。
EngineYard Cloud 以类似于 Capistrano 的方式部署到 AWS 实例。每次部署后,我们都会遇到 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'
部署后会话对象为nil,但是会话数据仍然存在数据库中,会话ID cookie仍然存在:
会话:
- 会话 ID:无
- 数据:无
我们无法解释这一点。有什么想法可能是根本原因吗?
感谢您的任何建议!
编辑:只是为了更新这一点,我们已经能够隔离一个错误示例。
1) 用户加载表单 2) 代码在服务器上更新 3) 用户提交表单 ** 发生无效的 Authenticity Token 错误
似乎当环境发生变化时,Rails 无法使用真实性令牌来处理。
我们尝试了几个步骤来解决:
- 重置会话
- 删除会话 cookie(在 JavaScript 和 Rails 中)
- 部署代码后擦除数据库中的会话表
没有任何作用。唯一可行的方法是让用户在客户端清除其 cookie。
(我们一直在谷歌搜索(甚至尝试过 Binging!)寻找答案,但没有骰子。这似乎是一个类似的相关问题:http://railsforum.com/viewtopic.php?id=21479)
另外:最初我们认为这与我们部署到 EngineYard 是孤立的,但我们也能够在我们通过 Capistrano 部署到的开发服务器上重现它。
我们将不胜感激地接受任何想法。
谢谢!
【问题讨论】:
-
我现在没有时间查找答案,但是您将想要进入 Rails 源代码并确切了解身份验证令牌是如何生成的。可能是服务器重新启动正在更改用于播种该令牌的值。
标签: ruby-on-rails ruby deployment