A fait une mise à niveau de 5.4 à 5.7, après cela chaque demande de publication ajax est 419 avec:
<?php
$encrypter = app('Illuminate\Encryption\Encrypter');
$encrypted_token = $encrypter->encrypt(csrf_token());
?>
<input id="token" type="hidden" value="{{$encrypted_token}}">
A suivi les instructions de mise à niveau qui mentionnent particulièrement la sérialisation des cookies:
payload is invalid
Cache vide, vérifié que les permissions du fichier sont correctes. Je suis descendu à 5,6, puis à 5,5 versions de laravel mais aucune aide. Changé le nom du cookie, essayé incognito. J'ai même essayé de tout contourner:
public function delete(Request $request)
{
$id = $request->input('data);
Post::where('id', $id)->delete();
}
Mais aucun changement. Qu'est-ce qui pourrait mal tourner ici?
Edit:
Appel Ajax:
var $_token = $('#token').val();
var url = '/delete';
$.ajax({
headers: {'X-XSRF-TOKEN': $_token},
type: "POST",
url: url,
data: ({data: data}), // set up earlier
success: function (data) {
}
});
Contrôleur :
protected $except = [
"*"
];
Également essayé avec $ ('meta [name = "csrf-token"]'). attr ('content')
Cela a donné moi:
protected static $serialize = true;
Le jeton d'identification provient de:
{message: "", exception: "Symfony\Component\HttpKernel\Exception\HttpException",â¦}
exception: "Symfony\Component\HttpKernel\Exception\HttpException"
file: "pathto/vendor/laravel/framework/src/Illuminate/Foundation/Exceptions/Handler.php"
line: 204
message: ""
trace: [{,â¦}, {file: "pathto/public_html/app/Exceptions/Handler.php", line: 47, function: "render",â¦},â¦]
0: {,â¦}
class: "Illuminate\Foundation\Exceptions\Handler"
file: "pathto/vendor/laravel/framework/src/Illuminate/Foundation/Exceptions/Handler.php"
function: "prepareException"
line: 176
type: "->"
3 Réponses :
Difficile à dire sans votre contrôleur et l'appel ajax réel ... mais j'ai eu des problèmes similaires avec cette erreur 419. Il y avait deux raisons pour moi:
1) Échec de la vérification du jeton. Pour vérifier, ajoutez ceci à votre appel ajax:
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
Bien que ... votre avoir essayé d'excepter tout aurait dû permettre cela (en supposant que vous ayez cette ligne au bon endroit ).
EDIT : Si vous transmettez votre X-XSRF-TOKEN à partir de JavaScript, décodez-le en utilisant decodeURIComponent () code >
2) Il est possible que votre contrôleur essaie de rendre la vue sans toutes les informations dont il a besoin. Avez-vous besoin d'envoyer une variable à la vue dans la fonction de contrôleur ajax et qu'elle est manquante? Je me rends compte que cela fonctionnait avant, mais il y a eu de gros changements dans la version 5.5 (y compris la façon dont CSRF était géré comme ci-dessus).
3) Juste une erreur générale que j'ai eue, mais il est possible que les données ne sont pas transférées de la même manière qu'avec 5.4. Vérifiez simplement si la manière dont les données entrent dans le contrôleur n'est pas une erreur. IE effectue un vidage du contrôleur avant qu'il ne revienne à la vue et voit ce que votre navigateur rapporte.
OK je vois! Merci pour la réponse. J'ai ajouté plus d'informations à la question. Je n'ai rien transmis directement à afficher dans aucun des appels ajax. Et contrôleur, même si je sors; directement dans la première ligne du contrôleur, j'obtiens cette erreur.
Merci d'avoir posté votre appel ajax. Je pense que je pourrais avoir la réponse à votre problème, voir la modification ci-dessus.
Cela va faire quelques jours que je pourrai réessayer, mais merci! Je vais essayer et mettre à jour!
ajoutez simplement
<form method="POST" action="/projects">
{{ csrf_field() }}
<div class="form-group">
<label for="title">Title</label>
<input id="title" class="form-control" type="text" name="title" placeholder="Project Title" required />
</div>
<div class="form-group">
<button type="submit" class="btn btn-primary">
Create Project
</button>
</div>
</form>
à votre modèle de lame
quelque chose comme
{{ csrf_field() }}
Je passe déjà le jeton csrf à l'appel. Aussi pas un formulaire mais basé sur un clic à la place. J'ai également essayé avec {{csrf_field}} et obtenir cette valeur pour passer dans les en-têtes ajax mais cela a abouti à "la charge utile est invalide"
Ancien sujet, mais je viens d'y revenir maintenant et je l'ai compris.
La raison était que je passais: XSRF-Token dans l'ancien Laravel au lieu de CSRF-Token, les versions jamais ne semblent plus fonctionner avec XSRF. Je suis passé à CSRF et cela a résolu le problème.
publier votre méthode de contrôleur
avez-vous aussi
composer dump-autoload@AshleyBrown, chaque méthode fonctionnait parfaitement dans la version 5.4, mais après la mise à niveau, ce n'est pas le cas, je doute donc que ce soit dans le contrôleur. Et oui, j'ai fait du compositeur dump-autoload, malheureusement aucune aide là non plus.