gpt4 book ai didi

ruby-on-rails - Rails - 部署后无效的真实性 token

转载 作者:数据小太阳 更新时间:2023-10-29 06:34:20 24 4
gpt4 key购买 nike

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

EngineYard Cloud 以类似于 Capistrano 的方式部署到 AWS 实例。每次部署后,我们都会遇到 Invalid Authenticity Token 错误。具体来说,任何以前访问过我们的应用程序然后在部署后访问并尝试提交表单的用户都会收到无效的真实性 token 错误。此错误一直存在,直到他们为网站重置 cookie。在他们重置 cookie 后,该网站按预期运行,没有错误。

我们正在使用 ActiveRecord 的 session 存储并将 session 保存到数据库中。

这是我们看到的错误:

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,但是session数据仍然存在于数据库中,session ID cookie仍然存在:

Session:

  • session id: nil
  • data: nil

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

感谢您的任何建议!


编辑:为了对此进行更新,我们已经能够隔离错误示例。

1) 用户加载表单2)代码在服务器上更新3)用户提交表单** 出现无效的真实性 token 错误

看来,当环境发生变化时,Rails 无法使用真实性 token 来处理这个问题。

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

  • 重置 session
  • 删除 session cookie(在 JavaScript 和 Rails 中)
  • 部署代码后删除数据库中的 session 表

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

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

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

我们将不胜感激地接受任何想法。

谢谢!

最佳答案

回答:经过 EngineYard 的大量工作(他们太棒了!),他们能够诊断出问题。这个问题的根本原因是杂种集群的错误。 Mongrel启动后好像看不到第一个post请求。 EngineYard 做了大量工作来诊断这一点:

There doesn't appear to be anything in your code causing the issue and I have found people outside of our environment that have experienced the bug as well (http://www.thought-scope.com/2009/07/mongrelcluster-rails-23x-bad-post.html). I suppose a lot of people don't see it because the first request to a site generally isn't a post or they chalk it up to flukes.

[There is a potential workaround using CURL.] The curl work around would do a simple GET request to each of your mongrels on the server to prime them so to speak. You could do this with capistrano, but that won't work if you deploy via the dashboard. You can find a short section on deploy hooks we have built into the infrastructure here: https://cloud-support.engineyard.com/faqs/overview/getting-started-with-engine-yard-cloud

Adding a simple run curl http://localhost:500x > /dev/null should work (where x is the port you have 5000-50005 on your current setup).

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

关于ruby-on-rails - Rails - 部署后无效的真实性 token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1201901/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com