it-swarm.com.de

Der richtige Weg, um ein Echtheitszeichen mit AJAX zu senden.

Dies funktioniert, wird jedoch angehalten, weil es kein Authentifizierungstoken gibt:

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

Also versuchte ich es so hinzuzufügen:

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

Und es übergibt das auth_token korrekt als Parameter, aber es scheint den Rest meiner Form zu verlieren.

Wie auch immer, sowohl das Senden der funktionierenden Formulardaten als auch das Authentifizierungstoken auszuführen?

Dies ist eine Rails-Umgebung. Und ich habe das im Kopf.

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

Dinge, die ich probiert habe

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 );
    }
});
37
Trip

Tatsächlich lesen Sie das action-Attribut des Formulars und senden eine Post-Ajax-Anforderung an dieses Formular. Um Formulardaten zu senden, müssen Sie das Formular absenden oder Sie können die Formulardaten serialisieren und in einer Ajax-Anfrage senden

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

Dadurch werden Ihre Formulardaten serialisiert und zusammen mit einer Ajax-Anforderung gesendet. Das Authentifizierungstoken wird bereits über die Abfragezeichenfolge gesendet

29

Dieses Token wird standardmäßig auch bereits in einem der "Meta" -Tags im Kopf der Layoutdatei "application.html.erb" angezeigt, wenn sich folgende ERB oben befindet:

<%= csrf_meta_tag %>

Das ERB leistet in etwa:

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

Sie können es dann mit jQuery mit dem folgenden Code verwenden:

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

Keines davon funktionierte für mich, bis ich den X-CSRF-Token-Wert im Request-Header über JS wie folgt eingestellt habe:

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

token natürlich das CSRF-Token. Ich habe dies vom <meta name="csrf-token">-Tag erhalten und habe encodeURIComponent() nicht verwendet.

Update da dies sich für manche als nützlich erweist

Also alles in allem:

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

Vielen Dank!

Nur für die allgemeinere Verwendung klären.

Sie benötigen das js-Tag mit var AUTH_TOKEN im Kopf. Sollte so etwas sein.

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

Und dann fügen Sie einfach Ihre authenticity_token = AUTH_TOKEN in die Ajax-Daten ein, wenn Sie kein übergeordnetes (Formular) oder ähnliches benötigen.

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

Danke an die Jungs oben für das Teilen dieses Wissens!

15
Yavor Ivanov

Ich bin gerade auf dieses Problem gestoßen, habe es aber in meiner application.js-Datei versucht:

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

Dies ist die ursprüngliche Frage, auf die ich die Idee hatte: ajaxSend Question

3
carnator

Sie können AUTH_TOKEN als versteckte Eingabe in das Formular einfügen.

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

In Rails 5.1+ wird ein CSRF-Token automatisch angehängt, wenn Sie einen eingebauten Rails JS-Helfer für AJAX Anforderungen (von Rails-ujs), Beispiel:

Rails.ajax({
  url: "/your/url",
  type: "POST",
  data: "a=1&b=2",
  success: function(data) {
    console.log(data);
  }
});

Diese Bibliothek bietet Ihnen auch einen Helfer, um CSRF-Token manuell abzurufen, wenn Sie Folgendes benötigen:

Rails.csrfToken();
0

Die einfache Verwendung von form_tag enthält automatisch den CSRF-Tokenparameter. Rails unterstützt "unauffälliges Javascript", was bedeutet, dass das Formular weiterhin über AJAX gesendet wird. Controller-Aktionen unterstützen den Block "reply_to", und Sie können die Erweiterung .js.erb verwenden, um Änderungen an der Webseite als Antwort auf das Formularsenden vorzunehmen. 

0
wondersz1