我有一个我刚刚部署的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是否与我的动态子域名有关?
答案 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的解决方案。请注意,它可能不是最安全的解决方案。