Laravel 5.5 Ajax Call 419 (unbekannter Status)

145

Ich mache einen Ajax-Anruf, erhalte aber immer wieder den folgenden Fehler:

419 (unbekannter Status)

Keine Ahnung, was dies verursacht. Ich habe in anderen Posts gesehen, dass es etwas mit dem CSRF-Token zu tun hat, aber ich habe kein Formular, daher weiß ich nicht, wie ich das beheben soll.

Mein Anruf:

$('.company-selector li > a').click(function(e) {
     e.preventDefault();

     var companyId = $(this).data("company-id");


      $.ajax({
          headers: {
          'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
          },
          url: '/fetch-company/' + companyId,
          dataType : 'json',
          type: 'POST',
          data: {},
          contentType: false,
          processData: false,
          success:function(response) {
               console.log(response);
          }
     });
  });

Meine Route:

Route::post('fetch-company/{companyId}', 'HomeController@fetchCompany');

Meine Controller-Methode

/**
 * Fetches a company
 *
 * @param $companyId
 *
 * @return array
 */
public function fetchCompany($companyId)
{
    $company = Company::where('id', $companyId)->first();

    return response()->json($company);
}

Das ultimative Ziel ist es, etwas aus der Antwort in einem HTML-Element anzuzeigen.

Chris
quelle
4
Hattest du das? <meta name="csrf-token" content="{{ csrf_token() }}">
Hanlin Wang
@ HanlinWang Nein, ich habe kein Formular, es ist nur ein Dropdown.
Chris
Hast du {{csrf_field()}}in deinem Formular hinzugefügt ?
Mr. Pyramid
3
Dropdown ist ein Teil des Formulars, das Sie benötigen, um diese Anfrage über das Formular zu stellen
Mr. Pyramid
1
oder übergeben Sie das csrf_token in Ihren Daten wie folgt{'_token': {{csrf_token()}}}
Mr. Pyramid

Antworten:

300

Verwenden Sie dies im Kopfbereich:

<meta name="csrf-token" content="{{ csrf_token() }}">

und erhalte das csrf-Token in Ajax:

$.ajaxSetup({
  headers: {
    'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
  }
});

Bitte beziehen Sie sich auf die Laravel-Dokumentation csrf_token

Kannan K.
quelle
1
Danke, es hat bei mir funktioniert. Ich habe versucht, die 'DELETE'-Methode für den Ajax-Aufruf zu verwenden, und das hat wie ein Zauber funktioniert.
Salvo
4
Ich habe genau diesen Code eingerichtet, aber in der folgenden Situation tritt immer noch das Problem von OP auf: Der Benutzer ist angemeldet, aber die Site bleibt für einen langen Zeitraum inaktiv (z. B. geht der Computer bei geöffnetem Browser in den Ruhezustand). In diesem Fall tritt dieser Fehler auf, wenn der Benutzer zum Computer zurückkehrt und einen AJAX-Aufruf versucht. Nach einem Nachladen ist alles wieder normal. Hat jemand eine Lösung dafür?
Jovan
@jovan Es gibt zwei Möglichkeiten, wie Sie dies leicht erreichen können. Schauen Sie sich diese fantastischen JQuery-Bibliotheken an: https://www.jqueryscript.net/other/Session-Timeout-Alert-Plugin-With-jQuery-userTimeout.html https://github.com/kidh0/jquery.idle . Zweitens: Überprüfen Sie bei Ihrer Ajax-Anfrage, ob ein Fehlercode von 419 zurückgegeben wird, und leiten Sie dann um.
Riliwanrabo
@jovan Auch ich hatte Probleme damit und selbst das Schließen des Browsers usw. würde das Problem nicht beheben. Ich habe es jedoch geschafft, herauszufinden, wie ich das Problem beheben kann, und indem ich die oben erwähnte Codezeile 'ajaxsetup ()' in meinen post () -Aufruf eingefügt habe - das csrf-Token wurde richtig gesetzt und alles begann einwandfrei zu funktionieren.
SupaMonkey
2
Aber warum 419 Unknown status? Warum nicht 419 Invalid CSRF tokenoder eine vorhandene, nützliche Antwort? Woher kommt das? Warum? Usw.
Rudie
26

Eine andere Möglichkeit, dies zu beheben, besteht darin, das _tokenFeld in Ajax-Daten zu verwenden und den Wert {{csrf_token()}}in Blade festzulegen. Hier ist ein Arbeitscode, den ich gerade an meinem Ende ausprobiert habe.

$.ajax({
    type: "POST",
    url: '/your_url',
    data: { somefield: "Some field value", _token: '{{csrf_token()}}' },
    success: function (data) {
       console.log(data);
    },
    error: function (data, textStatus, errorThrown) {
        console.log(data);

    },
});
Waqas Bukhary
quelle
Header: {'X-CSRF-TOKEN': $ ('meta [name = "csrf-token"]'). attr ('content')},
Kamlesh
12

Dies ähnelt Kannans Antwort. Dies behebt jedoch ein Problem, bei dem das Token nicht an domänenübergreifende Sites gesendet werden sollte. Dadurch wird der Header nur festgelegt, wenn es sich um eine lokale Anforderung handelt.

HTML:

<meta name="csrf-token" content="{{ csrf_token() }}">

JS:

$.ajaxSetup({
    beforeSend: function(xhr, type) {
        if (!type.crossDomain) {
            xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content'));
        }
    },
});
Damien Ó Ceallaigh
quelle
Das normale Header-Setup funktionierte eine Weile für mich, hatte aber nach Monaten, in denen ich gut gearbeitet hatte, zufällig Probleme. Ich bin mir nicht ganz sicher, warum es aus dem Nichts Probleme gab, aber diese Lösung hat großartig funktioniert und das Problem für mich behoben.
Frank A.
7

Verwenden Sie dies auf Ihrer Seite

<meta name="csrf-token" content="{{ csrf_token() }}">

und in Ihrem Ajax verwendet es in Daten:

_token: '{!! csrf_token() !!}',

das ist:

$.ajax({
          url: '/fetch-company/' + companyId,
          dataType : 'json',
          type: 'POST',
          data: {
                   _token: '{!! csrf_token() !!}',
                 },
          contentType: false,
          processData: false,
          success:function(response) {
               console.log(response);
          }
     });

Vielen Dank.

Y. Joy Ch. Singha
quelle
7

Möglicherweise stimmt Ihre Sitzungsdomäne nicht mit Ihrer App-URL und / oder dem Host überein, der für den Zugriff auf die Anwendung verwendet wird.

1.) Überprüfen Sie Ihre .env-Datei:

SESSION_DOMAIN=example.com
APP_URL=example.com

2.) Überprüfen Sie config / session.php

Überprüfen Sie die Werte, um sicherzustellen, dass sie korrekt sind.

Jeff Callahan
quelle
1
Das war die richtige Lösung für mich. Sehr frustrierend, der HTTP 419-Code stimmt nicht mit der HTTP-Spezifikation überein und kann so viele Dinge bedeuten.
Cobolt
5

Wenn Sie die obigen Vorschläge bereits gemacht haben und das Problem immer noch haben.

Stellen Sie sicher, dass die env-Variable:

SESSION_SECURE_COOKIE

Wird auf gesetzt, false wenn Sie kein SSL-Zertifikat haben, wie auf lokal.

2Fwebd
quelle
4

In meinem Fall habe ich vergessen, dem übermittelten Formular die Eingabe csrf_token hinzuzufügen. Also habe ich diesen HTML-Code erstellt:

<form class="form-material" id="myform">
...
<input type="file" name="l_img" id="l_img">
<input type="hidden" id="_token" value="{{ csrf_token() }}">
..
</form>

JS:

//setting containers
        var _token = $('input#_token').val();
        var l_img = $('input#l_img').val();
        var formData = new FormData();
        formData.append("_token", _token);
        formData.append("l_img", $('#l_img')[0].files[0]);

        if(!l_img) {
            //do error if no image uploaded
            return false;
        }
        else
        {
            $.ajax({
                type: "POST",
                url: "/my_url",
                contentType: false,
                processData: false,
                dataType: "json",
                data : formData,
                beforeSend: function()
                {
                    //do before send
                },
                success: function(data)
                {
                    //do success
                },
                error: function(jqXhr, textStatus, errorThrown) //jqXHR, textStatus, errorThrown
                {
                    if( jqXhr.status === "422" ) {
                        //do error
                    } else {
                        //do error
                    }
                }
            });
        }
        return false; //not to post the form physically
Der Tote
quelle
1
Dies <input type="hidden" id="_token" value="{{ csrf_token() }}">ist notwendig, auch wenn wir einen Submit Whitouth Ajax machen, sonst habe ich einen seltsamen 419 Fehler
Sr.PEDRO
3

Auch wenn Sie eine haben csrf_token, können Sie, wenn Sie Ihre Controller-Aktionen mit Laravel authentifizieren Policies, auch eine 419-Antwort erhalten. In diesem Fall sollten Sie Ihrer PolicyKlasse die erforderlichen Richtlinienfunktionen hinzufügen .

Tharanga
quelle
3

Wenn Sie .js aus einer Datei laden, müssen Sie eine Variable mit dem csrf_token in Ihrer "main" .blade.php-Datei festlegen, in die Sie die .js importieren, und die Variable in Ihrem Ajax-Aufruf verwenden.

index.blade.php

...
...
<script src="{{ asset('js/anotherfile.js') }}"></script>
<script type="text/javascript">
        var token = '{{ csrf_token() }}';
</script>

anotherfile.js

$.ajax({
    url: 'yourUrl',
    type: 'POST',
    data: {
        '_token': token
    },
    dataType: "json",
    beforeSend:function(){
        //do stuff
    },
    success: function(data) {
        //do stuff
    },
    error: function(data) {
        //do stuff
    },
    complete: function(){
        //do stuff
    }
});
Wolfernand
quelle
1

einige refs =>

...
<head>
    // CSRF for all ajax call
    <meta name="csrf-token" content="{{ csrf_token() }}" />
</head>
 ...
 ...
<script>
    // CSRF for all ajax call
    $.ajaxSetup({ headers: { 'X-CSRF-TOKEN': jQuery('meta[name="csrf-token"]').attr('content') } });
</script>
...
WARUM
quelle
1

Serialisieren Sie einfach die Formulardaten und lösen Sie Ihr Problem.

data: $('#form_id').serialize(),
Muhammad Umair
quelle
1

Sie müssen das csrf-Token erhalten.

$.ajaxSetup({
  headers: {
    'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
  }
});

Nachdem das gleiche Problem aufgetreten ist, fügen Sie einfach dieses Meta-Tag hinzu< meta name="csrf-token" content="{{ csrf_token() }}" >

Danach tritt auch der Fehler auf, Sie können den Ajax-Fehler überprüfen. Überprüfen Sie dann auch den Ajax-Fehler

$.ajax({
    url: 'some_unknown_page.html',
    success: function (response) {
        $('#post').html(response.responseText);
    },
    error: function (jqXHR, exception) {
        var msg = '';
        if (jqXHR.status === 0) {
            msg = 'Not connect.\n Verify Network.';
        } else if (jqXHR.status == 404) {
            msg = 'Requested page not found. [404]';
        } else if (jqXHR.status == 500) {
            msg = 'Internal Server Error [500].';
        } else if (exception === 'parsererror') {
            msg = 'Requested JSON parse failed.';
        } else if (exception === 'timeout') {
            msg = 'Time out error.';
        } else if (exception === 'abort') {
            msg = 'Ajax request aborted.';
        } else {
            msg = 'Uncaught Error.\n' + jqXHR.responseText;
        }
        $('#post').html(msg);
    },
});
Balaji Rajendran
quelle
1
formData = new FormData();
formData.append('_token', "{{csrf_token()}}");
formData.append('file', blobInfo.blob(), blobInfo.filename());
xhr.send(formData);
learnkevin
quelle
Vielen Dank für dieses Code-Snippet, das möglicherweise nur begrenzte, sofortige Hilfe bietet. Eine richtige Erklärung würde ihren langfristigen Wert erheblich verbessern, indem sie zeigt, warum dies eine gute Lösung für das Problem ist, und es für zukünftige Leser mit anderen, ähnlichen Fragen nützlicher machen. Bitte bearbeiten Sie Ihre Antwort, um eine Erklärung hinzuzufügen, einschließlich der von Ihnen getroffenen Annahmen.
Bestimmte Leistung
1

2019 Laravel Update, Ich hätte nie gedacht, dass ich dies veröffentlichen werde, aber für Entwickler wie mich, die die Browser-Abruf-API auf Laravel 5.8 und höher verwenden. Sie müssen Ihr Token über den Parameter headers übergeben.

var _token = "{{ csrf_token }}";
fetch("{{url('add/new/comment')}}", {
                method: 'POST',
                headers: {
                    'X-CSRF-TOKEN': _token,
                    'Content-Type': 'application/json',
                },
                body: JSON.stringify(name, email, message, article_id)
            }).then(r => {
                return r.json();
            }).then(results => {}).catch(err => console.log(err));
Delino
quelle
1

Ich hatte SESSION_SECURE_COOKIEauf true gesetzt, damit meine SESSION_SECURE_COOKIE=false Entwicklungsumgebung beim Anmelden nicht funktionierte. Deshalb habe ich meine Entwickler-ENV-Datei hinzugefügt und alles funktioniert einwandfrei. Mein Fehler bestand darin, die Datei session.php zu ändern, anstatt die Variable zur ENV-Datei hinzuzufügen.

Dunks1980
quelle
0

Dieser Fehler tritt auch auf, wenn Sie vergessen haben, dies in Ihre Ajax-Übermittlungsanforderung (POST) aufzunehmen: contentType: false, processData: false,

Schamseer Ahammed
quelle
0

Ich habe diesen Fehler erhalten, obwohl ich bereits ein CSRF-Token gesendet habe. Es stellte sich heraus, dass auf dem Server kein Speicherplatz mehr vorhanden war.

NicholasTes
quelle
0

Dies funktioniert hervorragend in Fällen, in denen Sie kein Formular benötigen.

Verwenden Sie dies in der Kopfzeile:

<meta name="csrf-token" content="{{ csrf_token() }}">

und das in Ihrem JavaScript-Code:

$.ajaxSetup({
        headers: {
        'X-CSRF-TOKEN': '<?php echo csrf_token() ?>'
        }
    });
lomelisan
quelle
0

Eine einfache Möglichkeit, einen unbekannten 419-Status auf Ihrer Konsole zu beheben, besteht darin, dieses Skript in Ihr FORMULAR einzufügen. {{csrf_field ()}}

Denz A Gatcho
quelle
0

Das hat bei mir funktioniert:

$.ajaxSetup({
  headers: {
    'X-CSRF-TOKEN': "{{ csrf_token() }}"
  }
});

Danach stellen Sie den regulären AJAX-Aufruf ein. Beispiel:

    $.ajax({
       type:'POST',
       url:'custom_url',

       data:{name: "some name", password: "pass", email: "[email protected]"},

       success:function(response){

          // Log response
          console.log(response);

       }

    });
Nole
quelle