Laravel 5.5 ajax call 419 (stato sconosciuto)


145

Faccio una chiamata Ajax ma continuo a ricevere questo errore:

419 (stato sconosciuto)

Non ho idea di cosa stia causando. Ho visto su altri post che deve fare qualcosa con il token csrf ma non ho forma quindi non so come risolvere questo problema.

la mia chiamata:

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

Il mio percorso:

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

Il mio metodo di controllo

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

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

L'obiettivo finale è quello di visualizzare qualcosa dalla risposta in un elemento html.


4
hai avuto questo? <meta name="csrf-token" content="{{ csrf_token() }}">
Hanlin Wang,

@HanlinWang No, non ho un modulo, è solo un menu a discesa.
Chris,

hai aggiunto {{csrf_field()}}nel tuo modulo ??
Mr. Pyramid,

3
il menu a discesa è una parte del modulo necessario per effettuare tale richiesta tramite il modulo
Mr. Pyramid,

1
o passa il csrf_token nei tuoi dati in questo modo{'_token': {{csrf_token()}}}
Mr. Pyramid,

Risposte:


301

Usalo nella sezione head:

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

e ottieni il token csrf in ajax:

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

Consultare la documentazione di Laravel csrf_token


1
Grazie, ha funzionato per me. Stavo cercando di usare il metodo 'DELETE' per la chiamata ajax e questo ha funzionato come un incantesimo.
Salvo,

4
Ho impostato questo codice esatto, ma sto ancora riscontrando il problema di OP nella seguente situazione: l'utente ha effettuato l'accesso, ma il sito rimane inattivo per un lungo periodo (ad esempio, il computer va a dormire con il browser aperto). In questo caso, quando l'utente torna al computer e prova una chiamata AJAX, si verifica questo errore. Dopo una ricarica, tutto è tornato alla normalità. Qualcuno ha una soluzione?
giovedì

@jovan Ci sono due modi per raggiungerlo facilmente. Dai un'occhiata a queste fantastiche librerie jquery https://www.jqueryscript.net/other/Session-Timeout-Alert-Plugin-With-jQuery-userTimeout.html https://github.com/kidh0/jquery.idle . In secondo luogo, sulla tua richiesta Ajax, controlla se restituisce un codice di errore di 419, quindi reindirizza.
riliwanrabo,

@jovan Anch'io stavo lottando con questo e persino chiudendo il browser, ecc. non avrei risolto il problema. Sono riuscito a trovare il modo di risolverlo e inserendo la suddetta riga di codice "ajaxsetup ()" menzionata sopra ENTRO la mia chiamata post () - il token csrf è stato impostato correttamente e tutto ha iniziato a funzionare in modo impeccabile.
SupaMonkey,

2
Ma perchè 419 Unknown status? Perché no 419 Invalid CSRF tokeno qualche risposta utile esistente? Da dove viene? Perché? Ecc.
Rudie,

26

Un altro modo per risolverlo è utilizzare il _tokencampo nei dati ajax e impostare il valore di {{csrf_token()}}in blade. Ecco un codice funzionante che ho appena provato alla mia fine.

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

    },
});

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

12

Questo è simile alla risposta di Kannan. Tuttavia, questo risolve un problema per cui il token non deve essere inviato a siti tra domini. Questo imposterà l'intestazione solo se si tratta di una richiesta locale.

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'));
        }
    },
});

La normale configurazione dell'intestazione ha funzionato per me per un po ', ma ha iniziato casualmente ad avere problemi dopo mesi di lavoro. Non sono del tutto sicuro del perché abbia iniziato ad avere problemi dal nulla, ma questa soluzione ha funzionato alla grande e risolto il problema per me.
Frank A.

7

usa questo nella tua pagina

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

e nel tuo Ajax lo ha usato nei dati:

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

questo è:

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

Grazie.


7

È possibile che il dominio della sessione non corrisponda all'URL dell'app e / o all'host utilizzato per accedere all'applicazione.

1.) Controlla il tuo file .env:

SESSION_DOMAIN=example.com
APP_URL=example.com

2.) Controlla config / session.php

Verificare i valori per assicurarsi che siano corretti.


1
Questa è stata la soluzione corretta per me. Molto frustrante, il codice HTTP 419 non corrisponde alle specifiche HTTP e può significare tante cose.
Cobolt,

5

Se hai già fornito i suggerimenti sopra riportati e il problema persiste.

Assicurarsi che la variabile env:

SESSION_SECURE_COOKIE

È impostato su false se non si dispone di un certificato SSL, come su locale.


4

nel mio caso ho dimenticato di aggiungere l'input csrf_token al modulo inviato. quindi ho fatto questo HTML:

<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

1
questo <input type="hidden" id="_token" value="{{ csrf_token() }}">è necessario anche se facciamo un invio senza ajax, altrimenti ho ricevuto uno strano errore 419
Sr.PEDRO

3

Anche se hai un csrf_token, se autentichi le tue azioni del controller usando Laravel Policiespuoi avere anche una risposta 419. In tal caso, è necessario aggiungere le funzioni politiche necessarie nella propria Policyclasse.


3

Se stai caricando .js da un file devi impostare una variabile con csrf_token nel tuo file .blade.php "principale" dove stai importando .js e usare la variabile nella tua chiamata ajax.

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

1

alcuni ref = =

...
<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>
...

1

serializza i dati del modulo e risolvi il problema.

data: $('#form_id').serialize(),

1

Devi ottenere il token csrf ..

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

Dopo aver sollevato lo stesso problema, basta aggiungere questo meta tag< meta name="csrf-token" content="{{ csrf_token() }}" >

Dopo ciò si verifica anche l'errore, è possibile verificare l'errore Ajax. Quindi controlla anche l'errore Ajax

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

1
formData = new FormData();
formData.append('_token', "{{csrf_token()}}");
formData.append('file', blobInfo.blob(), blobInfo.filename());
xhr.send(formData);

Grazie per questo frammento di codice, che potrebbe fornire un aiuto limitato e immediato. Una spiegazione adeguata migliorerebbe notevolmente il suo valore a lungo termine mostrando perché questa è una buona soluzione al problema e la renderebbe più utile ai futuri lettori con altre domande simili. Si prega di modificare la risposta di aggiungere qualche spiegazione, tra le ipotesi che hai fatto.
CertainPerformance,

1

Aggiornamento Laravel 2019, non avrei mai pensato di pubblicarlo, ma per quegli sviluppatori come me che usano il browser scarica API su Laravel 5.8 e versioni successive. Devi passare il token tramite il parametro headers.

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));

1

Avevo SESSION_SECURE_COOKIEimpostato su true quindi il mio ambiente di sviluppo non funzionava durante l'accesso, quindi ho aggiunto SESSION_SECURE_COOKIE=false al mio file .env dev e tutto funziona bene il mio errore è stato quello di modificare il file session.php invece di aggiungere la variabile al file .env.


0

Questo errore si verifica anche se hai dimenticato di includerlo, nella tua richiesta di invio ajax (POST), contentType: false, processData: false,


0

Ho ricevuto questo errore anche se avevo già inviato token csrf. Si è scoperto che non c'era più spazio sul server.


0

Funziona benissimo per quei casi in cui non è richiesto un modulo.

usa questo nell'intestazione:

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

e questo nel tuo codice JavaScript:

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

0

Un modo semplice per correggere uno stato 419 sconosciuto sulla console è inserire questo script nel FORM. {{csrf_field ()}}


0

Questo ha funzionato per me:

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

Dopo questo set regolare la chiamata AJAX. Esempio:

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

       data:{name: "some name", password: "pass", email: "test@test.com"},

       success:function(response){

          // Log response
          console.log(response);

       }

    });
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.