Laravel 5.5 Ajax Call 419 (état inconnu)

145

Je fais un appel ajax mais j'obtiens toujours cette erreur:

419 (état inconnu)

Aucune idée de la cause de cela, j'ai vu sur d'autres messages, il doit faire quelque chose avec le jeton csrf mais je n'ai pas de formulaire, donc je ne sais pas comment résoudre ce problème.

mon appel:

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

Mon itinéraire:

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

Ma méthode de contrôleur

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

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

Le but ultime est d'afficher quelque chose de la réponse dans un élément html.

Chris
la source
4
avez-vous cela? <meta name="csrf-token" content="{{ csrf_token() }}">
Hanlin Wang
@HanlinWang Non, je n'ai pas de formulaire, c'est juste une liste déroulante.
Chris
avez-vous ajouté {{csrf_field()}}dans votre formulaire ??
Mr.Pyramid
3
le menu déroulant fait partie du formulaire dont vous avez besoin pour faire cette demande via le formulaire
Mr. Pyramid
1
ou passez le csrf_token dans vos données comme ceci{'_token': {{csrf_token()}}}
Mr. Pyramid

Réponses:

301

Utilisez ceci dans la section principale:

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

et obtenez le jeton csrf en ajax:

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

Veuillez consulter la documentation Laravel csrf_token

Kannan K
la source
1
Merci, cela a fonctionné pour moi. J'essayais d'utiliser la méthode «DELETE» pour l'appel ajax et cela a fonctionné comme un charme.
Salvo
4
J'ai ce code exact configuré, mais je rencontre toujours le problème d'OP dans la situation suivante: l'utilisateur est connecté, mais le site reste inactif pendant une longue période (par exemple, l'ordinateur se met en veille avec le navigateur ouvert). Dans ce cas, lorsque l'utilisateur revient à l'ordinateur et tente un appel AJAX, cette erreur se produit. Après un rechargement, tout est revenu à la normale. Quelqu'un a-t-il une solution à cela?
jovan
@jovan Il existe deux façons d'y parvenir facilement. Jetez un œil à ces superbes bibliothèques jquery https://www.jqueryscript.net/other/Session-Timeout-Alert-Plugin-With-jQuery-userTimeout.html https://github.com/kidh0/jquery.idle . Deuxièmement, sur votre requête ajax, vérifiez si elle renvoie un code d'erreur 419 puis redirigez.
riliwanrabo
@jovan Moi aussi, j'avais du mal avec cela et même la fermeture du navigateur, etc. J'ai réussi à trouver comment le résoudre et en mettant la ligne de code 'ajaxsetup ()' mentionnée ci-dessus DANS mon appel post () - le jeton csrf a été défini correctement et tout a commencé à fonctionner parfaitement.
SupaMonkey
2
Mais pourquoi 419 Unknown status? Pourquoi pas 419 Invalid CSRF tokenou une réponse existante et utile? D'où est ce que ça vient? Pourquoi? Etc
Rudie
26

Une autre façon de résoudre ce problème consiste à utiliser le _tokenchamp dans les données ajax et à définir la valeur de {{csrf_token()}}in blade. Voici un code fonctionnel que je viens d'essayer à ma fin.

$.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
la source
headers: {'X-CSRF-TOKEN': $ ('meta [name = "csrf-token"]'). attr ('content')},
Kamlesh
12

Ceci est similaire à la réponse de Kannan. Cependant, cela résout un problème où le jeton ne doit pas être envoyé à des sites interdomaines. Cela ne définira l'en-tête que s'il s'agit d'une demande 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'));
        }
    },
});
Damien Ó Ceallaigh
la source
La configuration normale de l'en-tête a fonctionné pour moi pendant un certain temps, mais a commencé à avoir des problèmes au hasard après des mois de bon fonctionnement. Je ne sais pas vraiment pourquoi il a commencé à avoir des problèmes venus de nulle part, mais cette solution a très bien fonctionné et a résolu le problème pour moi.
Frank A.
7

utilisez ceci dans votre page

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

et dans votre ajax utilisé dans les données:

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

C'est:

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

Merci.

Y. Joy Ch. Singha
la source
7

Il est possible que votre domaine de session ne corresponde pas à l'URL de votre application et / ou à l'hôte utilisé pour accéder à l'application.

1.) Vérifiez votre fichier .env:

SESSION_DOMAIN=example.com
APP_URL=example.com

2.) Vérifiez config / session.php

Vérifiez les valeurs pour vous assurer qu'elles sont correctes.

Jeff Callahan
la source
1
C'était la bonne solution pour moi. Très frustrant, le code HTTP 419 ne correspond pas à la spécification HTTP et peut signifier tant de choses.
Cobolt
5

Si vous avez déjà fait les suggestions ci-dessus et que vous rencontrez toujours le problème.

Assurez-vous que la variable env:

SESSION_SECURE_COOKIE

Est défini sur false si vous n'avez pas de certificat SSL, comme sur local.

2Fwebd
la source
4

dans mon cas, j'ai oublié d'ajouter l'entrée csrf_token au formulaire soumis. alors j'ai fait ce 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
Le mec mort
la source
1
cela <input type="hidden" id="_token" value="{{ csrf_token() }}">est nécessaire même si nous faisons une soumission whitouth ajax, sinon j'ai eu une erreur 419 bizarre
Sr.PEDRO
3

Même si vous avez un csrf_token, si vous authentifiez les actions de votre contrôleur à l'aide de Laravel, Policiesvous pouvez également avoir une réponse 419. Dans ce cas, vous devez ajouter les fonctions de stratégie nécessaires dans votre Policyclasse.

Tharanga
la source
3

Si vous chargez .js depuis un fichier, vous devez définir une variable avec le csrf_token dans votre fichier "principal" .blade.php où vous importez le .js et utilisez la variable dans votre appel 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
    }
});
Wolfernand
la source
1

quelques 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>
...
POURQUOI
la source
1

sérialisez simplement les données du formulaire et résolvez votre problème.

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

Vous devez obtenir le jeton csrf.

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

Après avoir fait le même problème, il suffit d'ajouter cette balise meta< meta name="csrf-token" content="{{ csrf_token() }}" >

Après cela, l'erreur se produit également, vous pouvez vérifier l'erreur Ajax. Ensuite, vérifiez également l'erreur 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);
    },
});
Balaji Rajendran
la source
1
formData = new FormData();
formData.append('_token', "{{csrf_token()}}");
formData.append('file', blobInfo.blob(), blobInfo.filename());
xhr.send(formData);
apprendre
la source
Merci pour cet extrait de code, qui pourrait fournir une aide limitée et immédiate. Une explication appropriée améliorerait considérablement sa valeur à long terme en montrant pourquoi c'est une bonne solution au problème et la rendrait plus utile aux futurs lecteurs avec d'autres questions similaires. Veuillez modifier votre réponse pour ajouter des explications, y compris les hypothèses que vous avez formulées.
CertainPerformance
1

Mise à jour de Laravel 2019, je n'aurais jamais pensé publier cela, mais pour les développeurs comme moi, utilisant le navigateur, récupérez l'api sur Laravel 5.8 et supérieur. Vous devez transmettre votre jeton via le paramètre 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));
Delino
la source
1

J'avais SESSION_SECURE_COOKIEréglé sur true, donc mon environnement de développement ne fonctionnait pas lors de la connexion, donc j'ai ajouté SESSION_SECURE_COOKIE=false à mon fichier dev .env et tout fonctionne bien.Mon erreur a été de changer le fichier session.php au lieu d'ajouter la variable au fichier .env.

Dunks1980
la source
0

Cette erreur se produit également si vous avez oublié d'inclure ceci, dans votre demande de soumission ajax (POST), contentType: false, processData: false,

Shamseer Ahammed
la source
0

Vous avez cette erreur même si j'avais déjà envoyé un jeton csrf. Il s'est avéré qu'il n'y avait plus d'espace libre sur le serveur.

NicholasTes
la source
0

Cela fonctionne très bien pour les cas où vous n'avez pas besoin d'un formulaire.

utilisez ceci dans l'en-tête:

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

et ceci dans votre code JavaScript:

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

Un moyen simple de corriger un statut inconnu 419 sur votre console est de mettre ce script à l'intérieur de votre FORMULAIRE. {{csrf_field ()}}

Denz A Gatcho
la source
0

Cela a fonctionné pour moi:

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

Après ce set appel AJAX régulier. Exemple:

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

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

       success:function(response){

          // Log response
          console.log(response);

       }

    });
Nole
la source