2

我试图将远程表单从表单之一(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)中使用相同的表单时,我得到了正确的结果。

我找到了一种在所有子域(domain: :allin session_store.rb)中共享 cookie 的方法,但我找不到在 Ajax 请求中共享令牌的方法。

我正在使用 Rails 3.1.3、Ruby 1.9.3 和 jQuery 1.7.1。

任何人都可以帮助我,好吗?

编辑:

该问题似乎与CORS有关。现在我正在尝试找到一个最小摩擦的解决方案来使这个(异步)跨子域请求工作。

4

2 回答 2

3

在您的 POST 参数中,将“authenticity_token”字段包含在助手 *form_authenticity_token* 返回的值中。(它与 cookie 无关)。

编辑我认为您正在违反同源策略,该策略会阻止域 A 中的 javascript 与域 B 通信(也适用于子域)。对此有一个称为 CORS 的“覆盖”,您正在与之交谈的域必须实现它。

因此,假设您可以控制域 A 和 B,则可以解决此限制。这解释了为什么“正常”请求有效,而“:remote => true”请求无效。(CSRF 令牌错误可能不准确。)这是一篇关于在 Rails 中设置 CORS 的文章(在我的示例中是域 B)。

于 2012-01-19T18:10:11.333 回答
0

您可以将两个控制器中的真实性令牌设置为相同

我认为是这样

protect_from_forger :secret => 'long_secret_string'

如果两个控制器使用相同的令牌,您应该能够跨子域或其他站点发布。您确实打开了一些跨站点脚本漏洞

于 2012-01-19T18:43:02.150 回答