web-dev-qa-db-fra.com

Poster une demande dans Laravel 5.7 --- Erreur - 419 Désolé, votre session a expiré

J'ai installé Laravel 5.7

Ajout d'un formulaire au fichier \resources\views\welcome.blade.php

<form method="POST" action="/foo" >
    @csrf
    <input type="text" name="name"/><br/>
    <input type="submit" value="Add"/>
</form>

Ajouté au fichier \routes\web.php

Route::post('/foo', function () {
    echo 1;
    return;
});

Après avoir envoyé une demande POST:

419 Désolé, votre session a expiré. Veuillez actualiser et réessayer.

Dans la version 5.6 il n'y avait pas un tel problème.

Avant de lire ci-dessous, assurez-vous que vous avez bien @csrf ou {{ csrf_field() }} dans votre formulaire

<form method="post">
@csrf <!-- {{ csrf_field() }} -->
... rest of form ...
</form>

Le message d'erreur de session expirée s'affiche car la vérification du jeton csrf échoue quelque part, ce qui signifie que le middleware App\Http\Middleware\VerifyCsrfToken::class est déjà activé. Sous la forme, la directive de lame @csrf est déjà ajoutée, ce qui devrait également convenir.

Ensuite, l'autre domaine à vérifier est la session. La vérification du jeton csrf est directement impliquée dans votre session. Par conséquent, vous pouvez vérifier si votre pilote de session fonctionne ou non. Par exemple, un Redis configuré de manière incorrecte peut provoquer un problème.

Peut-être que vous pouvez essayer de changer votre pilote de session/logiciel de votre fichier .env, les pilotes supportés sont donnés ci-dessous

Pilotes de session pris en charge dans Laravel 5.7(Doc Link)

  • file - les sessions sont stockées dans storage/framework/sessions. 
  • cookie - les sessions sont stockées dans des cookies sécurisés et cryptés.
  • database - les sessions sont stockées dans une base de données relationnelle. 
  • memcachedredis - les sessions sont stockées dans l'un de ces magasins rapides basés sur le cache.
  • array - les sessions sont stockées dans un tableau PHP et ne seront pas persistées.

Si votre formulaire fonctionne après le changement de pilote de session, il y a un problème avec ce pilote, essayez de corriger l'erreur à partir de là.

_/Scénarios susceptibles de provoquer des erreurs

  • Les sessions basées sur des fichiers risquent de ne pas fonctionner à cause des problèmes d’autorisation avec le répertoire /storage (un rapide googling va vous chercher la solution)

  • Dans le cas du pilote de base de données, votre connexion à la base de données peut être incorrecte ou la table sessions peut ne pas exister ou être configurée de manière incorrecte (la configuration incorrecte a été confirmée comme étant un problème selon le commentaire de @Junaid Qadir).

  • La configuration redis/memcached est incorrecte ou est manipulée par un autre élément de code dans le système en même temps.

Il peut être judicieux d’exécuter php artisan key:generate et de générer une nouvelle clé d’application qui, à son tour, videra les données de la session. 

Effacer le cache du navigateur HARD, j'ai découvert que Chrome et Firefox étaient plus que jamais un coupable.

En savoir plus sur l'importance des clés d'application

21
Shobi

Cela est dû au fait que le formulaire nécessite un fichier csrf. Dans la version 5.7, ils l'ont changé en @csrf

<form action="" method="post">
    @csrf
    ...

Référence: https://laravel.com/docs/5.7/csrf

12
David

Comment utiliser

{{ csrf_field() }} au lieu de @csrf

L'erreur 419 est principalement due à des problèmes de jeton csrf.

4
Bonish Koirala

J'utilise Laravel 5.7 J'ai eu le même problème et c'était parce que le jeton CSRF n'était pas sous la forme

@csrf

résolu le problème

4
Karim Samir

cas 1: si vous exécutez un projet dans votre système local tel que 127.0.01: 8000,

puis 

ajoutez SESSION_DOMAIN= dans votre fichier .env

ou dans votre config/session.php 'domain' => env('SESSION_DOMAIN', ''),

puis exécutez php artisan cache:clear

cas 2: si le projet est en cours d'exécution sur le serveur et que vous avez un domaine tel que "mydomain.com"

ajoutez SESSION_DOMAIN=mydomain.com dans votre fichier .env

ou dans votre config/session.php 'domain' => env('SESSION_DOMAIN', 'mydomain.com'),

puis exécutez php artisan cache:clear

2
Saurabh Mistry

remplacez votre @csrf dans welcome.blade.php par <input type="hidden" name="_token" value="{{ csrf_token() }}">

alors votre code ressemble à ceci:

<form method="POST" action="/foo" >
    <input type="hidden" name="_token" value="{{ csrf_token() }}">
    <input type="text" name="name"/><br/>
    <input type="submit" value="Add"/>

   <button type="submit">Submit</button>
</form>
2
Aghnat Atqiya

Vous avez ajouté le champ CSRF de manière incorrecte. Au lieu de @csrf, vous devriez utiliser csrf_field() comme ceci:

<form method="POST" action="/foo" >
    {{ csrf_field() }}
    <input type="text" name="name"/><br/>
    <input type="submit" value="Add"/>
</form>
1
Istiyak Amin

Essayez de commenter \App\Http\Middleware\EncryptCookies::class dans \app\Http\Kernel.php J'ai un problème similaire et je l'ai résolu en procédant de la sorte . Probablement pas la meilleure solution car la sécurité mais au moins cela a fonctionné.

Auparavant j'ai essayé:

  • Vider le cache
  • Générer une nouvelle clé d'application
  • Exécuter mon application dans différents navigateurs (Chrome 70, Mozilla Firefox 57 et IE 11)
  • Exécuter mon application sur un autre ordinateur
  • Commenter \App\Http\Middleware\VerifyCsrfToken::class dans \app\Http\Kernel.php
  • Commenter \Illuminate\Session\Middleware\AuthenticateSession::class dans \app\Http\Kernel.php
  • Mise à niveau et déclassement de Laravel (entre 5,6 et 5,7)

Mais aucun de ces ci-dessus n'a fonctionné pour moi.

1
Prasna Lukito

Je venais juste d'avoir exactement le même problème et il était essentiel que je sois complètement stupide. J'avais désactivé tous les champs du formulaire (plutôt que le bouton de soumission) via javascript avant de soumettre ledit formulaire! Bien entendu, cela a eu pour résultat que tous les éléments du formulaire n'ont pas été soumis (y compris le champ _token caché), ce qui a généré l'erreur 419!

J'espère que cela aide quelqu'un de quelques heures à se gratter la tête!

Les entrées de formulaire désactivées n'apparaissent pas dans la requête

0
Splodge

Il n'y a pas de problème dans le code. J'ai vérifié avec le même code que vous avez écrit avec la nouvelle installation.

Code de formulaire:

<form method="POST" action="/foo" >
    @csrf
    <input type="text" name="name"/><br/>
    <input type="submit" value="Add"/>
</form>

web.php code du fichier:

Route::get('/', function () {
    return view('welcome');
});

Route::post('/foo', function () {
    echo 1;
    return;
});

Le résultat après la soumission du formulaire est:  Output after submitting the form

Si vous effacez le cache de votre navigateur ou essayez avec un autre navigateur, je pense que cela sera corrigé.

0
engrhussainahmad

Vous ne pouvez pas faire de déclaration vide sur Laravel 5.6 ou plus. Laravel s'attend toujours à ce qu'une valeur soit retournée. (Je sais par expérience) . C'est principalement lié à la façon dont PHP 7 traite les retours vides.

0
Jamie Ross

C'est peut-être exagéré, mais vous pouvez essayer ceci:

// Formulaire appelant named route avec un champ de jeton masqué ajouté.

<form method="POST" action="{{ route('foo') }}" >
    @csrf
    <input type="hidden" name="_token" value="{!! csrf_token() !!}">
    <input type="text" name="name"/><br/>
    <input type="submit" value="Add"/>
</form>

// Nommé Route

Route::post('/foo', function () {
    return 'bar';
})->name('foo');

// Ajouter ceci dans le bloc <head></head>:

<meta name="_token" content="{!! csrf_token() !!}" />

Je l'ai testé sur mon local en utilisant Homestead sur Laravel 5.7, qui était une nouvelle installation en utilisant Laravel Installer 2.0.1 et tout fonctionnait bien. Quel est votre environnement?

Théorie: je me demande si cela a quelque chose à voir avec le rendu des balises HTML avec {{ }} contre {!! !!} sur votre environnement ou la façon dont vous le fournissez (par exemple, php artisan serve). Ce qui me fait penser que c'est line 335 sur /vendor/laravel/framework/src/illuminate/Foundation/helpers.php devrait afficher la même ligne saisie manuellement ci-dessus. 

0
jeremykenedy

J'ai également eu un problème comme celui-ci et j'ai découvert que les fichiers de session étaient verrouillés en écriture. Donc, je ne sais pas si vous utilisez votre Laravel via des éléments tels que vagrant ou Docker, mais je vous conseille d'essayer de modifier les droits du répertoire de la session (et des fichiers bien sûr) (lorsque vous exécutez Laravel dans un VM vous devez modifier les droits localement et dans VM (comme lorsque vous partagez des fichiers via NFS)

Comme ça:

chmod -R 777 storage/framework/sessions
chmod -R 777 storage/logs

Je sais, une autorisation 777 est la pire catastrophe que vous puissiez imaginer. Mais ils sont pratiques pour le dépannage.

Pour être sûr de ne jamais l'oublier, j'ai créé un script bash. (Appelé cela lalog, simplement parce que je voulais effacer les fichiers journaux et définir des autorisations) 

Remarque: Assurez-vous de l'utiliser dans le répertoire de la session. Dans config/session.php, il existe une clé files déclarée avec l'emplacement. Dans mon cas:

<?php
//...........
'files' => storage_path('framework/sessions'),
//...........

Emplacement:/usr/bin/lalog (il s’agit d’un fichier et non d’un répertoire)
Exécuter dans Shell en tant que lalog

#!/bin/bash
rm -rf /home/username/Projects/x/storage/logs/laravel.log
echo "Laravel log removed"
touch /home/username/Projects/x/storage/logs/laravel.log
echo "Laravel log created"
chmod -R 777 /home/username/Projects/x/storage/
echo "CHMOD 777 on Storage dir"

Attention! Cela permettra un accès en écriture pour tout le monde, alors soyez prudent avec ce dernier! De plus, le fichier journal de Laravel contient peut-être des informations utiles. (assurez-vous de regarder dans ce fichier journal avant d'exécuter mon script bash)

Aussi, je sais que c'est déjà mentionné. Mais, soyez totalement sûr que vous avez toujours

  1. Autoriser les cookies dans le navigateur, afin que le jeton puisse être défini dans les cookies
  2. Vérifiez si vous utilisez le @csrf dans votre fichier de lame

Le formulaire devrait être quelque chose comme ça

<form method="POST" action="{{ route('login') }}">
@csrf
.......
</form>
0
Koen Hollander

Dans votre Http/Kernel.php

essayez de commenter cette ligne: 

\Illuminate\Session\Middleware\AuthenticateSession::class,

dans votre tableau de middleware Web

ce pourrait être la racine de votre problème

0
Mathieu Ferre

Juste pour le dire, j’ai eu les mêmes problèmes. Sur mon Homestead local, cela fonctionnerait comme prévu, mais après l'avoir poussé sur le serveur de développement, j'ai également reçu le message de délai de session. Constatant que c’est un problème d’environnement, j’ai changé d’Apache à nginx et qui a miraculeusement fait disparaître le problème.

0
Kees Hessels

En réalité, SCRF est un jeton de session . Ajoutez votre route dans un groupe de routes et ajoutez un middleware qui contrôle les sessions.

web est un middleware par défaut dans laravel et il peut contrôler les demandes de session.

Route::group(array('middleware' => ['web']), function () {
  Route::post('/foo', function () {
     echo 1;
     return;
  });
});
0
Zia

Par défaut je n'ai pas eu ce problème. Donc, ce que j’ai fait, c’est chmod -R 644 sessionspour répliquer le problème. 

 enter image description here

Ensuite, j'ai donné les autorisations au dossier de sessions par chmod -R 755 sessions

maintenant mon code de projet fonctionne à nouveau.

 enter image description here

La raison en est que vous stockez votre cache sur un fichier sans autorisation d'écriture

Le fichier de configuration de la session est stocké dans config/session.php. Être Veillez à examiner les options disponibles dans ce fichier. Par défaut, Laravel est configuré pour utiliser le pilote de session de fichier, qui fonctionnera bien pour de nombreuses applications. Dans les applications de production, vous pouvez Pensez à utiliser les pilotes memcached ou redis pour une session encore plus rapide performance.

Solutions:

1 - Comme je l’ai corrigé ci-dessus, vous pouvez donner 755 autorisations au dossier des sessions. 2 - Vous pouvez utiliser une autre configuration de pilote de session. 

fichier - les sessions sont stockées dans storage/framework/sessions. biscuit - les sessions sont stockées dans des cookies sécurisés et cryptés. base de données - sessions sont stockés dans une base de données relationnelle. memcached/redis - les sessions sont stockés dans l’un de ces magasins rapides basés sur le cache. tableau - les sessions sont stockées dans un tableau PHP et ne seront pas persistées.

Garder à l'esprit; Si vous souhaitez utiliser memcached/redis, vous devez les installer sur votre serveur ou votre conteneur Docker Redis doit être en cours d'exécution.

0
Anar Bayramov

Une mauvaise approche rapide consiste à accéder à app\http\middleware\verifycsrftoken.php et à ajouter la route dans $ except list. La demande de publication sera ignorée pour la vérification du jeton CSRF.

protected $except = [
    //
    'doLogin.aspx',
    'create_coupon',
];
0
Qasim Ali