"La page a expiré en raison d'une inactivité" - Laravel 5.5

111

Ma page d'enregistrement affiche correctement le formulaire avec CsrfToken ( {{ csrf_field() }}) présent dans le formulaire).

Formulaire HTML

<form class="form-horizontal registration-form" novalidate method="POST" action="{{ route('register') }}">
        {{ csrf_field() }}
        ....
</form>

J'utilise l'authentification intégrée pour les utilisateurs. N'ont rien changé sauf les itinéraires et les redirections.

Lorsque je soumets le formulaire (juste après le rechargement également), cela indique que La page a expiré en raison de l'inactivité. Veuillez actualiser et réessayer. Erreur.

Mon être, il me manque une toute petite chose. Mais pas sûr de ce que c'est. De l'aide?

Mettre à jour

J'ai trouvé le problème. Le pilote de session a été défini sur array. Je l'ai changé en fichier et l'erreur a disparu maintenant. Mais qu'est-ce qui ne va pas si j'utilise un tableau?

Sougata Bose
la source
Peut avoir quelque chose à voir avec le stockage_path n'étant pas accessible en écriture. C'est là qu'il stocke les données de session concernant les jetons si vous utilisez des sessions basées sur des fichiers.
Devon
1
J'ai trouvé le problème. Le pilote de session a été défini sur array. Je l'ai changé en fichier et l'erreur a disparu maintenant. Mais qu'est-ce qui ne va pas si j'utilise un tableau?
Sougata Bose
ou cette URL vérifie stackoverflow.com/questions/39997180/…
Fatih TÜZEN
1
Pour la nouvelle version de laravel, utilisez @csrf pour résoudre le problème.
Vuong Tran

Réponses:

164

Si vous arrivez à cette réponse directement à partir d'une recherche , assurez-vous d'avoir déjà ajouté le jeton csrf à votre formulaire avec {{ csrf_field() }}comme l'OP.


Si votre pilote de session est défini sur fichier:

Peut avoir quelque chose à voir avec le stockage_path n'étant pas accessible en écriture. C'est là qu'il stocke les données de session concernant les jetons si vous utilisez des sessions basées sur des fichiers. Le peut être vérifié avecis_writable(config('session.files'))


Pour l'OP, le pilote de session a été défini sur array. Array est uniquement destiné aux tests. Étant donné que les données ne sont pas persistantes, il ne sera pas en mesure de comparer le jeton à la prochaine demande.

Le pilote de baie est utilisé pendant les tests et empêche la persistance des données stockées dans la session.

https://laravel.com/docs/5.5/session#configuration


Vérifiez config / session.php

Enfin, un problème que je viens d'avoir, nous avions un projet qui a le domaine de session et les paramètres sécurisés dans config / session.php mais le site de développement n'utilisait pas HTTPS (SSL / TLS). Cela a provoqué cette erreur générique puisque sessions.secure était défini sur true par défaut.

Devon
la source
3
D'accord. Mais pour l'instant, il est en développement. Donc, si j'utilise un tableau, pourquoi cela me donnait cette erreur?
Sougata Bose
Les tests @SougataBose ne sont pas du développement. Les données du tableau ne sont pas persistantes ...
Devon
C'est la raison pour laquelle il faut parcourir les DOCs correctement .. :)
Sougata Bose
Mon problème n'a pas été résolu. J'ai vraiment fait les bases. Mais j'utilise des fournisseurs et des services personnalisés. Il n'y a aucun problème lorsque j'appelle une méthode de contrôleur, mais lorsque j'exécute une méthode de service dans un contrôleur qui a appelé avec une demande de publication, le problème apparaît!
Behnam Azimi
1
J'ai eu un problème similaire avec les sessions, mais en ce qui concerne les tests. Il s'est avéré que lorsque j'utilisais Carbon::setTestNow($time);dans les tests, je ne l'effaçais pas en utilisant Carbon::setTestNow();ensuite.
riotCode
77

J'ai rencontré le même problème dans Laravel 5.5. Dans mon cas, c'est arrivé après avoir changé une route de GET à POST. Le problème était dû au fait que j'avais oublié de transmettre un jeton CSRF lorsque je suis passé à POST.

Vous pouvez soit publier un jeton CSRF dans votre formulaire en appelant:

 {{ csrf_field() }}

Ou excluez votre route dans app / Http / Middleware / VerifyCsrfToken.php

 protected $except = [
        'your/route'
    ];
Hyder B.
la source
2
csrf_field()présent dans le formulaire. La réponse acceptée décrit le problème. Merci.
Sougata Bose
1
Dans mon cas, je recevais un POST d'un tiers, donc l'ajout de csrf_field () n'était pas une option. Puisque CSRF n'était pas un facteur dans mon cas, l'ajout d'une exception à cette route a résolu le problème. Merci.
Fábio Duque Silva
Mon problème n'a pas été résolu. J'ai vraiment fait les bases. Mais j'utilise des fournisseurs et des services personnalisés. Il n'y a aucun problème lorsque j'appelle une méthode de contrôleur, mais lorsque j'exécute une méthode de service dans un contrôleur qui a appelé avec une demande de publication, le problème apparaît!
Behnam Azimi
1
Veuillez ne pas désactiver la vérification CSRF! Il est très important d'avoir une protection. Découvrez comment envoyer correctement le jeton et protéger vos utilisateurs connectés contre les javascript malveillants qui peuvent soumettre des actions en leur nom.
Devon
11

Essayez-les tous.

composer dump-autoload
php artisan optimize
php artisan cache:clear
php artisan config:clear
php artisan route:clear
php artisan view:clear
Sagar Chamling
la source
Au lieu d'essayer toutes les commandes ci-dessus, utilisez ce package github.com/afrazahmmad/clear-all-cached-data
Afraz Ahmad
6

Mon cas a été résolu avec SESSION_DOMAIN, dans ma machine locale devait être réglé sur xxx.localhost. Cela provoquait des conflits avec la production SESSION_DOMAIN, xxx.comqui était définie directement dans le fichier de configuration session.php.

Andrés Ruiz
la source
Quel pilote de session utilisiez-vous? fileou cookie?
KeitelDOG
4

Certaines informations sont stockées dans le cookie qui est lié aux versions précédentes de laravel en développement. C'est donc en conflit avec les jetons générés par csrf qui sont générés par les versions d'un autre. Effacez simplement le cookie et essayez.

Suresh Velusamy
la source
avez-vous pu voir le <input type="hidden" name="_token" value="Umr1AlG3sScdUWGtMoHcQPPKASsR7qsd5ZE1H3Xv">type de code dans le html généré?
Suresh Velusamy
C'est là. J'ai trouvé le problème. Le pilote de session a été défini sur array. Je l'ai changé en fichier et l'erreur a disparu maintenant.
Sougata Bose
4

Pour ceux qui ont encore des problèmes et rien n'y fait. Faites attention au paramètre php.ini mbstring.func_overload. Il doit être défini sur 0. Et mbstring.internal_encoding défini sur UTF-8. Dans mon cas, c'était un problème.

andrew_jackson
la source
Merci beaucoup! Votre réponse a sauvé mon cerveau de l'écrasement)
Rustembek Kaliyev
3

Je change l'autorisation de stockage et l'erreur a disparu. Il semblait que le problème était le manque de permission.

sudo chmod -R 775 storage/
Buddhi Kasun
la source
2
Soyez prudent en utilisant ces autorisations ouvertes de manière récursive. Je recommande vivement contre 775 pour les fichiers. 755 pour les répertoires et 644 pour les fichiers est la norme.
Devon
3

ajoutez @csrfle formulaire et accédez également à VerifyCsrfToken.php

app-> Http-> Middleware-> VerifyCsrfToken.php

protected $except = [
        'paste your route here'
    ];
Shery
la source
1

Dans mon cas, le site était bien en serveur mais pas en local. Ensuite, je me souviens que je travaillais sur un site Web sécurisé.
Donc, dans le fichier config.session.php, définissez la variable secure sur false

'secure' => env('SESSION_SECURE_COOKIE', false),
Irfandi D. Vendy
la source
0

J'avais l'application avec plusieurs sous-domaines et le cookie de session était le problème entre ceux-ci. La suppression des cookies a résolu mon problème.

Aussi, essayez de régler le SESSION_DOMAINdans .env fichier. Utilisez le sous-domaine exact que vous parcourez.

Mladen Janjetovic
la source
0

Assurez-vous d'avoir l'heure système correcte sur votre serveur Web. Dans mon cas, la machine à vagabonder était dans le futur (26 janvier 14:08:26 UTC 2226), donc bien sûr, l'heure dans le cookie de session de mon navigateur avait expiré il y a plus de 200 ans.

mim.ms
la source
0

définir mbstring.func_overload = 2

ça m'a aidé

Toxi Gen
la source
0

J'ai trouvé deux solutions pour éviter ces erreurs 1) en ajoutant protected $ except = ['/ yourroute'] possible désactiver l'inspection du jeton csrf à partir de la racine définie. 2) il suffit de commenter la ligne \ App \ Http \ Middleware \ VerifyCsrfToken :: class dans le groupe middleware protégé du noyau

Damitha Dayananda
la source
0

J'ai eu le même problème mais le problème n'est pas dans le cadre mais dans le navigateur. Je ne sais pas pourquoi mais Google Chrome bloque automatiquement les cookies, dans mon cas. Après avoir autorisé les cookies, le problème a été résolu.

Anwar Pervez
la source
0

Réponse courte

Ajouter l'entrée d'itinéraire pour registerdansapp/Http/Middleware/VerifyCsrfToken.php

protected $except = [
        '/routeTo/register'
    ];

et effacez le cache et la route du cache avec les commandes:

php artisan cache:clear && php artisan route:clear

Détails

Chaque fois que vous accédez à un site Laravel, un token est généré, même si la session n'a pas été démarrée. Ensuite, à chaque demande, ce token (stocké dans les cookies) sera validé par rapport à son heure d'expiration, définie dans le SESSION_LIFETIMEchamp du config/session.phpfichier.

Si vous maintenez le site ouvert pendant plus que le délai d'expiration et essayez de faire une demande, ce jeton sera évalué et l'erreur d'expiration sera renvoyée. Ainsi, pour ignorer cette validation sur les formulaires qui sont en dehors des fonctions des utilisateurs authentifiés (comme l'inscription ou la connexion), vous pouvez ajouter la route except in app/Http/Middleware/VerifyCsrfToken.php.

JC Gras
la source
1
Si cette page traite les entrées de l'utilisateur, elle doit passer par des vérifications CSRF .
Sougata Bose
@SougataBose En effet, dans ce cas, je pense qu'il est préférable d'utiliser un validateur captcha comme Google reCAPTCHA
JC Gras
0

Plusieurs fois, cela se produit parce que vous testez un projet dans le passé

Oparam
la source
0

Solution:

utilisez le nouvel onglet de navigation privée, puis testez-le à nouveau.

raison:

dans mon cas, un autre utilisateur s'est connecté avec mon panneau d'administration

sabre tabatabaee yazdi
la source