我试图将远程表单从表单(domain.com)发送到另一个子域(example.domain.com),但我一直在日志中获得警告WARNING: Can't verify CSRF token authenticity
,chrome中的检查器告诉我请求的状态为(canceled)
,类型为application/x-www-form-urlencoded
。
这是表格:button_to "Follow", follow_users_url(subdomain: post.user_username_slug), remote: true
当我去掉remote: true
时,我得到了我想要的结果。此外,当一个用户尝试在操作的相同子域(example.domain.com)中使用相同的表单时,我得到了正确的结果。
我找到了一种在所有子域中共享cookie的方法(session_store.rb
中的domain: :all
),但我找不到在Ajax请求中共享令牌的方法。
我使用的是Rails 3.1.3、Ruby 1.9.3和jQuery 1.7.1。
有人能帮我吗?
编辑:
这个问题似乎与CORS有关。现在,我正试图找到一个最小摩擦的解决方案,使这个(异步)跨子域请求工作。
在POST参数中,包括字段"authenticity_token"和助手*form_authenticity_taken*返回的值。(这与饼干无关)。
编辑我认为您遇到了同源策略,该策略阻止域A中的javascript与域B通信(也适用于子域)。有一个名为CORS的"覆盖",与对话的域必须实现它。
因此,假设您同时控制域A和域B,您就可以绕过这个限制。这解释了为什么"正常"请求有效,而":remote=>true"请求无效。(CSRF令牌错误可能不准确。)下面是一篇关于在Rails中设置CORS的文章(在我的示例中是域B)。
您可以将两个控制器中的真实性令牌设置为相同的
我想是
protect_from_forger:secret=>'long_secret_string'
如果两个控制器使用相同的令牌,您应该能够跨子域或其他站点发布。通过