web-dev-qa-db-fra.com

Laravel 5.5 ajax call 419 (statut inconnu)

Je fais un appel ajax mais je continue à avoir cette erreur:

419 (statut inconnu)

Aucune idée de la cause de ceci n’a été vu sur d’autres articles, il doit faire quelque chose avec le jeton Csrf mais je n’ai pas de formulaire, je ne sais donc 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.

83
Chris

Utilisez ceci dans la section head: 

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

et obtenez le jeton csrf dans ajax:

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

Veuillez vous référer à la documentation Laravel csrf_token

183
Kannan K

Une autre solution consiste à utiliser le champ _token dans les données ajax et à définir la valeur de {{csrf_token()}} dans la lame. Voici un code de travail que je viens d’essayer de mon côté.

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

    },
});
17
Waqas Bukhary

Ceci est similaire à la réponse de Kannan. Cependant, cela corrige un problème où le jeton ne devrait pas être envoyé aux sites interdomaines. Cela définira uniquement l'en-tête s'il s'agit d'une requête 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'));
        }
    },
});
8
Damien Ó Ceallaigh

Il est possible que votre domaine de session ne correspond 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.

6
Jeff Callahan

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.

5
Y. Joy Ch. Singha

dans mon cas, j'ai oublié d'ajouter une entrée csrf_token au formulaire soumis.

<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
4
The Dead Guy

Si vous chargez un fichier .js à partir d'un fichier, vous devez définir une variable avec le csrf_token dans votre fichier "principal" .blade.php où vous importez le fichier .js et utiliser 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>

un autre fichier.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
    }
});
2
Wolfernand

Si vous avez déjà fait les suggestions ci-dessus et que vous avez 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. 

2
2Fwebd

Même si vous avez un csrf_token, si vous authentifiez les actions de votre contrôleur en utilisant Laravel Policies, vous pouvez également avoir une réponse 419. Dans ce cas, vous devez ajouter les fonctions de stratégie nécessaires dans votre classe Policy.

2
Tharanga

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 que l'erreur se soit produite, vous pouvez vérifier l'erreur Ajax. Puis 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);
    },
});
1
Balaji Rajendran

il suffit de sérialiser les données du formulaire et de résoudre votre problème.

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

des 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>
...
1
WHY

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

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

Vous avez cette erreur alors que j'avais déjà envoyé un jeton CSRF. Il s'est avéré qu'il ne restait plus d'espace sur le serveur.

0
NicholasTes

Cette erreur se produit également si vous avez oublié de l'inclure dans votre demande de soumission ajax (POST), ContentType: false, ProcessData: false,

0
Shamseer Ahammed

Un moyen simple de corriger un statut inconnu 419 sur votre console consiste à insérer ce script dans votre FORM. {{csrf_field ()}}

0
Denz A Gatcho

2019 Laravel Mise à jour, Je ne pensais pas publier cela, mais pour les développeurs comme moi qui utilisaient l'API de récupération de navigateur sur Laravel 5.8 et au-dessus. Vous devez passer votre jeton via le paramètre en-tête.

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));
0
Delino
formData = new FormData();
formData.append('_token', "{{csrf_token()}}");
formData.append('file', blobInfo.blob(), blobInfo.filename());
xhr.send(formData);
0
learnkevin