无处不在的AuthenticityToken无处不在

时间:2010-04-07 13:57:34

标签: ruby-on-rails ruby session passenger

我有一个我刚刚部署的rails应用程序,它在提交表单的任何地方都会生成Invalid AuthenticityToken错误。该应用程序使用子域名作为帐户名称,最终还允许输入自定义域名。我在production.rb中有一个条目,允许跨域会话处理。

问题是您无法登录/或提交任何表单,因为所有内容都会引发Invalid AuthenticityToken错误。问题看起来与Rails - Invalid Authenticity Token After Deploy相似但不一样,而且我没有使用mongrel。我已经尝试在浏览器中清除cookie,然后重启乘客,但没有运气。

有人有什么想法吗?

服务器正在运行nginx + passenger 2.3.11和Rails 2.3.5。

#production.rb
config.action_controller.session[:domain] = '.domain.com'


#environment.rb
config.action_controller.session = {
   :session_key => '_app_session',
   :secret      => '.... nums and chars .....'
 }

更新:我刚刚注意到我的生产环境中没有设置会话cookie。因此,我猜测会话不能与CSRF值相关联。我想知道未设置的cookie是否与我的动态子域名有关?

3 个答案:

答案 0 :(得分:2)

确保您的服务器配置为具有正确的域名。当真实性令牌的cookie被设置为与服务器实际上不同的域时,我已经看到了这一点。客户不会意识到他们需要发送cookie。

另一种可能性是您的生产会话存储以某种方式被破坏。如果Rails无法找到用户的会话,则会因InvalidAuthenticityToken而失败。

答案 1 :(得分:0)

尝试这个

<%= javascript_tag "window._token = '#{form_authenticity_token}'" %>

OR REF: - http://api.rubyonrails.org/classes/ActionController/RequestForgeryProtection/ClassMethods.html

答案 2 :(得分:0)

尝试将以下内容添加到ApplicationController

protect_from_forgery :only => [:create, :delete, :update]

来自http://www.ruby-forum.com/topic/136093的解决方案。请注意,它可能不是最安全的解决方案。