"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?


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


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.


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'
    ];

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



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.


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.


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.


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/

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'
    ];

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),

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.


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.



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


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.


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.


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é


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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.