使用 AJAX 在 Rails 上加载 CSRF 令牌

Posted

技术标签:

【中文标题】使用 AJAX 在 Rails 上加载 CSRF 令牌【英文标题】:Loading CSRF token on rails with AJAX 【发布时间】:2012-05-28 12:28:17 【问题描述】:

我决定只加载一个页面来实现我的 Rails 站点,并通过 AJAX 完成其他所有工作。问题是meta 中生成的 CSRF 令牌一旦用于提交注册或登录表单就会失效。如何在不重新加载页面的情况下更新它?

【问题讨论】:

使用getElementByIdgetElementsByTagName 操作META 标签有什么问题? 如果我在注册前和注册后使用相同的,它会拒绝 CSRF 令牌。我想知道如何在不重新加载整个页面的情况下更新令牌。 【参考方案1】:

我不认为 Rails 在每次请求(或发布或其他任何内容)后都会使 CSRF 元令牌无效(如果没有,像主干.js 这样的框架将很难:)。

https://github.com/rails/rails/blob/7fb99e5743d88c04357e09960d112376428a6faa/actionpack/lib/action_controller/metal/request_forgery_protection.rb#L100

您可能在您认为是 invalid 的请求之前提出了一个请求,但没有正确的令牌,因此 rails 会删除您的会话,并且后续请求即使通过了先前正确的请求也会被标记为无效令牌。

【讨论】:

对,如果我想在不刷新页面的情况下发出多个请求(表单提交),那会是什么样子?【参考方案2】:

在每个 ajax 请求中:

添加到数据:

authenticity_token: ''

【讨论】:

【参考方案3】:

你可以在你的 ajax 调用中使用如下的 beforeSend 来调用 put、post 方法。 $.ajax( type: 'POST', beforeSend: function(xhr) xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content')), url: your url, data: data );

【讨论】:

以上是关于使用 AJAX 在 Rails 上加载 CSRF 令牌的主要内容,如果未能解决你的问题,请参考以下文章

基本 .ajax 发布到 rails 3.2.2 脚手架,生成“警告:无法验证 CSRF 令牌真实性”

Rails 没有在 ajax 帖子上重新加载会话

即使设置了标头,也无法验证 CSRF 令牌的真实性 Rails 4 Ajax

获取向 Rails 服务器发出请求的 API

Rails,设计认证,CSRF 问题

即使请求标头中包含正确的 x-csrf-token,也不要在 Ajax 帖子上设置 current_user