Правильный способ отправки токена подлинности с помощью 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 как param, но, похоже, теряет остальную часть моей формы.

в любом случае, чтобы выполнить как отправку данных формы, которая работает, так и токен подлинности?

это среда 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 );
    }
});

7 ответов


на самом деле, Вы читаете 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-запросом, а токен подлинности уже отправляется через строку запроса


этот токен также уже появляется в одном из тегов "meta" в главе приложения.формат html.файл макета erb по умолчанию, если у вас есть следующий ERB вверху:

<%= csrf_meta_tag %>

что Эрб примерно передает:

<meta content="abc123blahblahauthenticitytoken" name="csrf-token">

затем вы можете захватить его с помощью jQuery со следующим кодом:

var AUTH_TOKEN = $('meta[name=csrf-token]').attr('content');

ни один из них не работал для меня, пока я не установил X-CSRF-Token значение в заголовке запроса через JS, например:

request.setRequestHeader('X-CSRF-Token', token)

token конечно, будучи токеном CSRF. Я получил это от <meta name="csrf-token"> tag и не использовал encodeURIComponent()

обновление так как это оказывается полезным для некоторых

в целом:

var token = document.querySelector('meta[name="csrf-token"]').content
request.setRequestHeader('X-CSRF-Token', token)

спасибо!

как раз уточнить для более общей пользы.

вам нужен тег 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 (form) или что-то вроде этого.

$.ajax({
  type: 'post',
  dataType:'text',
  data: "user_id="+user_id+"&authenticity_token="+AUTH_TOKEN,
  url:'/follow/unfollow'
})

спасибо ребятам выше за обмен этими знаниями!


вы можете включить AUTH_TOKEN в саму форму в качестве скрытого ввода.

<input type="hidden" name="AUTH_TOKEN">1234abcd</input>

Я просто столкнулся с этой проблемой, но я попробовал этот подход в своем приложении.файл js:

$(document).ajaxSend(function(e, xhr, options) {
  if (options.data == null) {
    options.data = {};
  }
  options.data['authenticity_token'] = token;
});

Это оригинальный вопрос, где я получил идею:ajaxSend вопрос


простое использование form_tag автоматически включает параметр токена CSRF. Rails поддерживает "ненавязчивый Javascript", что означает, что форма все равно будет отправлена через AJAX. Действия контроллера поддерживают блок" respond_to", и вы можете его использовать .js.расширение erb для внесения изменений на веб-странице в ответ на форму отправки.