【问题标题】:Invalid AuthenticityToken everywhere到处都是无效的 AuthenticityToken
【发布时间】:2010-04-07 13:57:34
【问题描述】:

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

问题是您无法登录/或提交任何表单,因为一切都会引发 Invalid AuthenticityToken 错误。这个问题看起来与Rails - Invalid Authenticity Token After Deploy 相似但不一样,而且我没有使用mongrel。我试过清除浏览器中的 cookie,然后重新启动乘客,但没有成功。

有人有什么想法吗?

服务器正在运行 nginx + 乘客 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 是否与我的动态子域有关?

【问题讨论】:

    标签: ruby-on-rails ruby session passenger


    【解决方案1】:

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

    另一种可能性是您的生产会话存储以某种方式损坏。如果 Rails 找不到用户的会话,它将失败并显示 InvalidAuthenticityToken。

    【讨论】:

    • 我在我的 nginx vhost 文件中设置了通配符,但是我为我的一个子域添加了一个特定的路由,但仍然没有修复它。
    【解决方案2】:

    试试这个

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

    或 参考:- http://api.rubyonrails.org/classes/ActionController/RequestForgeryProtection/ClassMethods.html

    【讨论】:

    • 没有骰子。 form_authenticity_token JS 变量与表单中的输出相匹配,我可以看到当参数作为错误的一部分被转储时,它被提交到服务器。提交的令牌似乎不是服务器存档的。
    【解决方案3】:

    尝试将以下内容添加到您的ApplicationController

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

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

    【讨论】:

    • 不起作用,因为 SessionsController#create (和其他表单提交)是引发错误的原因。另外,我宁愿不禁用 csrf 保护
    猜你喜欢
    • 1970-01-01
    • 2011-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-30
    • 2017-11-09
    相关资源
    最近更新 更多