Recherche…
Introduction
J'ai analysé ce ratio pour obtenir une erreur TokenMismatch est très élevé. Et cette erreur se produit à cause de quelques erreurs stupides. Il existe de nombreuses raisons pour lesquelles les développeurs font des erreurs. Voici quelques exemples, par exemple No _token sur les en-têtes, No_token sur les données lors de l'utilisation d'Ajax, problème de permission sur le chemin de stockage, chemin de stockage de session non valide.
Configuration du jeton sur l'en-tête
Définissez le jeton sur <head>
de votre default.blade.php
.
<meta name="csrf-token" content="{{csrf_token()}}">
Ajoutez ajaxSetup
en haut de votre script, qui sera accessible partout. Cela va définir des en-têtes sur chaque appel ajax
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
Mettre le jeton sur
Ajoutez la fonction ci-dessous à votre <form>
. Cette fonction générera un champ masqué nommé _token
et une valeur remplie avec le jeton.
{{csrf_field()}}
Ajoutez la fonction csrf_token ()
à votre _token
caché dans l'attribut value. Cela ne générera que de la chaîne cryptée.
<input type="hidden" name="_token" value="{{csrf_token()}}"/>
.
Vérifier le chemin de stockage de la session et l'autorisation
Ici, je suppose que l'URL de l'application du projet est APP_URL=http://project.dev/ts/toys-store
- Définissez l'autorisation en écriture sur
storage_path('framework/sessions')
le dossier. - Vérifiez le chemin de votre projet laravel
'path' => '/ts/toys-store',
la racine de votre projet laravel. - Changez le nom de votre cookie
'cookie' => 'toys-store',
return [
'driver' => env('SESSION_DRIVER', 'file'),
'lifetime' => 120,
'expire_on_close' => false,
'encrypt' => false,
'files' => storage_path('framework/sessions'),
'connection' => null,
'table' => 'sessions',
'lottery' => [2, 100],
'cookie' => 'toys-store',
'path' => '/ts/toys-store',
'domain' => null,
'secure' => false,
'http_only' => true,
];
Utilisez le champ _token sur Ajax
Il y a plusieurs façons d'envoyer _token
sur un appel AJAX
- Récupère toutes les valeurs du champ de saisie dans la
<form>
utilisantvar formData = new FormData($("#cart-add")[0]);
- Utilisez
$("form").serialize();
ou$("form").serializeArray();
- Ajoutez
_token
manuellement auxdata
d'Ajax. en utilisant$('meta[name="csrf-token"]').attr('content')
ou$('input[name="_token"]').val()
. - Nous pouvons définir comme en-tête un appel Ajax particulier comme ci-dessous le code.
$.ajax({
url: $("#category-add").attr("action"),
type: "POST",
data: formData,
processData: false,
contentType: false,
dataType: "json",
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});