Правильный способ отправить токен подлинности с AJAX..?
Это работает, но останавливается, потому что ему не хватает токена подлинности:
$(".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 правильно в качестве параметра, но, похоже, теряет остальную часть моей формы.
В любом случае, чтобы выполнить как отправку данных формы, так и токена подлинности?
Это рельсовая среда. И у меня это в голове.
= 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 );
}
});
9 ответов
На самом деле, вы читаете action
атрибут формы и отправка на него почтового 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-запросом, а токен аутентификации уже отправляется через строку запроса.
Ни один из них не работал для меня, пока я не установил X-CSRF-Token
значение в заголовке запроса через JS, например:
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)
Этот токен также уже присутствует в одном из мета-тегов в заголовке файла макета application.html.erb по умолчанию, если в верхней части находится следующий ERB:
<%= csrf_meta_tag %>
Это ERB примерно показывает:
<meta content="abc123blahblahauthenticitytoken" name="csrf-token">
Затем вы можете получить его с помощью jQuery с помощью следующего кода:
var AUTH_TOKEN = $('meta[name=csrf-token]').attr('content');
Спасибо!
Просто чтобы уточнить для более общего использования.
Вам нужен тег js с var AUTH_TOKEN в вашей голове. Должно быть что-то вроде этого.
<%= csrf_meta_tag %>
<%= javascript_tag "var AUTH_TOKEN = '#{form_authenticity_token}';" if protect_against_forgery? %>
А затем просто поместите свой authenticity_token=AUTH_TOKEN в данные ajax, если вам не нужно использовать parent(форму) или что-то в этом роде.
$.ajax({
type: 'post',
dataType:'text',
data: "user_id="+user_id+"&authenticity_token="+AUTH_TOKEN,
url:'/follow/unfollow'
})
Спасибо ребятам выше за то, что поделились этими знаниями!
В Rails 5.1+ токен CSRF автоматически добавляется, если вы используете встроенный Rails
JS помощник для запросов AJAX (от rails-ujs
), пример:
Rails.ajax({
url: "/your/url",
type: "POST",
data: "a=1&b=2",
success: function(data) {
console.log(data);
}
});
Эта библиотека также предоставляет вам помощника для получения токена CSRF вручную, если вам это нужно:
Rails.csrfToken();
Я только столкнулся с этой проблемой, но я попробовал этот подход в моем файле 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>
Вот решение, которое применимо ко всем запросам AJAX. Вы добавляете следующее в свой all.js (или любой другой файл javascript для всего сайта):
$.ajaxSetup({
headers: {
'X-CSRF-Token': document.querySelector('meta[name="csrftoken"]').content
}
});
Это автоматически добавит токен в качестве заголовка для всех запросов AJAX. У меня работает в Rails 7.
Простое использование form_tag автоматически включает параметр токена CSRF. Rails поддерживает "Ненавязчивый Javascript", что означает, что форма будет по-прежнему отправляться через AJAX. Действия контроллера поддерживают блок "response_to", и вы можете использовать расширение.js.erb для внесения изменений на веб-странице в ответ на отправку формы.