![](/img/trans.png)
[英]Can't verify CSRF token authenticity Rails 4 Ajax even when header is set
[英]Proper way to send an Authenticity Token with AJAX to Rails
这可行,但由于缺少真实性令牌而停止:
$(".ajax-referral").click(function(){
$.ajax({type: "POST", url: $(this).parent("form").attr("action"), dataType: "script"});
return false;
});
所以我尝试像这样添加它:
$(".ajax-referral").click(function(){
$.ajax({type: "POST", url: $(this).parent("form").attr("action") + "?&authenticity_token=" + AUTH_TOKEN, dataType: "script"});
return false;
});
它正确地将 auth_token 作为参数传递,但似乎丢失了我的其余表单。
无论如何要完成发送有效的表单数据和真实性令牌?
这是一个 Rails 环境。 我脑子里有这个。
= javascript_tag "var AUTH_TOKEN = '#{form_authenticity_token}';" if protect_against_forgery?
我尝试过的事情
1.
= hidden_field :authenticity_token, :value => form_authenticity_token
2.
$.ajax({type: "POST", url: $(this).parent("form").attr("action"), dataType: "script", authenticity_token: AUTH_TOKEN});
3.
// Always send the authenticity_token with ajax
$(document).ajaxSend(function(event, request, settings) {
if ( settings.type != 'GET' ) {
settings.data = (settings.data ? settings.data + "&" : "")
+ "authenticity_token=" + encodeURIComponent( AUTH_TOKEN );
}
});
实际上,您正在阅读表单的action
属性并向其发送post ajax请求。 要发送表单数据,您必须提交表单,或者您可以序列化表单数据并将其发送到ajax请求中
$(".ajax-referral").click(function(){
$.ajax({
type: "POST",
url: $(this).parent("form").attr("action") + "?&authenticity_token=" + AUTH_TOKEN,
data:$(this).parent("form").serialize(),
dataType: "script"
});
return false;
});
执行此操作将序列化表单数据并将其与ajax请求一起发送,并且已通过查询字符串发送真实性令牌
如果您在顶部有以下ERB,则此标记也已默认显示在application.html.erb布局文件头部的“meta”标记之一中:
<%= csrf_meta_tag %>
ERB大致呈现:
<meta content="abc123blahblahauthenticitytoken" name="csrf-token">
然后,您可以使用jQuery使用以下代码获取它:
var AUTH_TOKEN = $('meta[name=csrf-token]').attr('content');
在我通过JS在请求标头上设置X-CSRF-Token
值之前,这些都不适合我:
request.setRequestHeader('X-CSRF-Token', token)
token
当然是CSRF令牌。 我从<meta name="csrf-token">
标签得到了这个,并没有使用encodeURIComponent()
更新,因为这证明对一些人有用
总而言之:
var token = document.querySelector('meta[name="csrf-token"]').content
request.setRequestHeader('X-CSRF-Token', token)
谢谢!
只是为了澄清更常见的用途。
你的头脑中需要带有var AUTH_TOKEN的js标签。 应该是这样的。
<%= csrf_meta_tag %>
<%= javascript_tag "var AUTH_TOKEN = '#{form_authenticity_token}';" if protect_against_forgery? %>
然后,如果您不需要使用父(表单)或类似的东西,只需将您的authenticity_token = AUTH_TOKEN放在ajax数据中。
$.ajax({
type: 'post',
dataType:'text',
data: "user_id="+user_id+"&authenticity_token="+AUTH_TOKEN,
url:'/follow/unfollow'
})
感谢上面的人分享这些知识!
我刚遇到这个问题,但我在application.js文件中尝试了这种方法:
$(document).ajaxSend(function(e, xhr, options) {
if (options.data == null) {
options.data = {};
}
options.data['authenticity_token'] = token;
});
这是我得到这个想法的原始问题: ajaxSend Question
您可以在表单中包含AUTH_TOKEN作为隐藏输入。
<input type="hidden" name="AUTH_TOKEN">1234abcd</input>
只需使用form_tag自动包含CSRF令牌参数。 Rails支持“Unobtrusive Javascript”,这意味着表单仍将通过AJAX提交。 控制器操作支持“respond_to”块,您可以使用.js.erb扩展名对网页进行更改以响应表单提交。
在Rails 5.1+中,如果您使用内置的Rails
JS帮助程序来处理AJAX请求(来自rails-ujs
),则会自动附加CSRF令牌,例如:
Rails.ajax({
url: "/your/url",
type: "POST",
data: "a=1&b=2",
success: function(data) {
console.log(data);
}
});
如果您需要,该库还为您提供了手动获取CSRF令牌的帮助:
Rails.csrfToken();
这是适用于所有 AJAX 请求的解决方案。 您将以下内容添加到您的 all.js (或任何您的站点范围的 javascript 文件)
$.ajaxSetup({
headers: {
'X-CSRF-Token': document.querySelector('meta[name="csrftoken"]').content
}
});
这将自动将令牌添加为所有 AJAX 请求的标头。 在 Rails 7 中为我工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.