Właściwy sposób wysyłania Tokena autentyczności za pomocą AJAX..?

To działa, ale zostaje zatrzymane, ponieważ nie ma tokena autentyczności:

$(".ajax-referral").click(function(){
  $.ajax({type: "POST", url: $(this).parent("form").attr("action"), dataType: "script"});
  return false;
});

Więc próbowałem dodać to tak:

$(".ajax-referral").click(function(){
  $.ajax({type: "POST", url: $(this).parent("form").attr("action") + "?&authenticity_token=" + AUTH_TOKEN, dataType: "script"});
  return false;
});

I przekazuje auth_token poprawnie jako param, ale wydaje się, że traci resztę mojej formy.

W każdym razie, aby zrealizować zarówno wysyłanie danych formularza, które działają, jak i token autentyczności?

To jest środowisko rails. I mam to w głowie.

= javascript_tag "var AUTH_TOKEN = '#{form_authenticity_token}';" if protect_against_forgery?

Things I ' ve wypróbowane

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 );
    }
});
Author: Trip, 2011-09-27

7 answers

W rzeczywistości czytasz atrybut action formularza i wysyłasz do niego zapytanie Post ajax. aby wysłać dane formularza musisz przesłać formularz lub możesz serializować dane formularza i wysłać je w żądaniu ajax jak

$(".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;
});

Spowoduje to serializację danych formularza i wysłanie ich wraz z żądaniem ajax, a token autentyczności jest już wysyłany za pomocą ciągu zapytania

 29
Author: Muhammad Adeel Zahid,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-27 12:40:28

Ten token pojawia się również w jednym z tagów "meta" w nagłówku aplikacji.html.plik układu erb domyślnie, jeśli masz następujący ERB na górze:

<%= csrf_meta_tag %>

Że ERB z grubsza renderuje do:

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

Możesz następnie pobrać go za pomocą jQuery z następującym kodem:

var AUTH_TOKEN = $('meta[name=csrf-token]').attr('content');
 22
Author: omdel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-17 23:21:37

Żadne z nich nie działało dla mnie, dopóki nie ustawiłem X-CSRF-Token wartości w nagłówku żądania przez JS w następujący sposób:

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

token Oczywiście, jako token CSRF. Dostałem to z tagu <meta name="csrf-token"> i nie użyłem encodeURIComponent()

Update ponieważ okazuje się to przydatne dla niektórych

Więc w sumie:

var token = document.querySelector('meta[name="csrf-token"]').content
request.setRequestHeader('X-CSRF-Token', token)
 16
Author: Adam Grant,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-23 19:30:01

Dzięki!

Tylko dla wyjaśnienia dla bardziej powszechnego użytku.

Potrzebujesz znacznika js z var AUTH_TOKEN w głowie. Powinno być coś takiego.

<%= csrf_meta_tag %>
<%= javascript_tag "var AUTH_TOKEN = '#{form_authenticity_token}';" if protect_against_forgery? %>

A następnie po prostu umieść swój authentity_token=AUTH_TOKEN w danych ajax, jeśli nie musisz używać rodzica (formularza) lub czegoś takiego.

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

Podziękowania dla chłopaków powyżej za dzielenie się tą wiedzą!

 15
Author: Yavor Ivanov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-03 09:26:42

Możesz dołączyć AUTH_TOKEN do samego formularza, jako ukryte dane wejściowe.

<input type="hidden" name="AUTH_TOKEN">1234abcd</input>
 3
Author: BishopRook,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-26 20:22:28

Właśnie natknąłem się na ten problem, ale próbowałem tego podejścia w mojej aplikacji.plik js:

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

To jest oryginalne pytanie skąd wpadłem na pomysł: ajaxSend Question

 3
Author: carnator,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:13

Po prostu użycie form_tag automatycznie zawiera parametr tokena CSRF. Rails obsługuje "dyskretny Javascript", co oznacza, że formularz nadal będzie przesyłany przez AJAX. Akcje kontrolera obsługują blok "respond_to" i możesz go użyć .js.rozszerzenie erb do wprowadzania zmian na stronie www w odpowiedzi na przesyłanie formularza.

 0
Author: wondersz1,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-08 21:25:38