【发布时间】:2016-10-07 03:41:01
【问题描述】:
我的控制器正在响应一个 js GET 请求,并且在我的 js.erb 文件中,我报告了 Fingerprint2 生成的用户浏览器的浏览器数据。这是通过 POST 请求完成的,因为数据字符串很大,所以我插入了一个添加 Authenticity Token 的beforeSend 方法。
但是,这被ActionController::InvalidAuthenticityToken - ActionController::InvalidAuthenticityToken 拒绝。当我检查时,标头看起来就像在成功的 GET 请求中一样:
X-CSRF-Token:hl/TgkY7k0yBG03KX9IBrsDhk2K4tUUh8JTooT7A0yYZ0l53p8lTt0F3dZvRwyS3bIkbbkuTdElP2KisozjXjw==
js代码如下:
(new Fingerprint2).get(function(fingerprint, components) {
return $.ajax({
url: "/user_browser",
type: "post",
beforeSend: function(xhr) {
xhr.setRequestHeader('X-CSRF-Token',
$('meta[name="csrf-token"]').attr('content'))
},
data: {
some_id: '123',
components: JSON.stringify(components),
fingerprint: fingerprint
},
dataType: "json"
}).success(function(data) {});
});
【问题讨论】:
-
以防万一,您确定可以从外部获取 csrf-token 并使用它,而不是为您的请求生成一个新的吗? here 它说“form_authenticity_token 生成一个有效的身份验证令牌。这在 Rails 不自动添加它的地方很有用,比如在自定义 Ajax 调用中。”
-
我想我可以重新使用在
csrf-token属性中生成的那个。当我从type: "post"切换到type: "get时没有问题。 -
从 get vs post 开始,get 请求未经过防伪验证。 here
-
好的,您确实可以在用户会话中使用相同的 csrf-token 内容。除非您使用的是 Rails 5 per_form_csrf_token,否则这应该是所有操作的相同标记,包括。阿贾克斯来电。关于这个主题的其他问答主要是指兑现问题,即令牌被缓存(例如属于其他用户)。您是否可以使用给定的令牌手动向服务器提交发布请求以进行验证?
标签: ruby-on-rails ajax ruby-on-rails-4 csrf authenticity-token