web-dev-qa-db-fra.com

Laravel Session change toujours chaque rafraîchissement/demande dans Laravel 5.4

Donc le titre dit tout, j’utilise Laravel 5.4, PHP 7.1 et mes sessions d’ordinateur local fonctionnent très bien. Essentiellement, lorsque j'essaie de me connecter ou de recharger la page à chaque fois que je reçois un nouveau jeton CSRF qui casse tout. J'utilise la base de données comme pilote de session et crée une nouvelle entrée dans la base de données à chaque requête que je fais. Cela s'est produit sur ma machine locale lors de la première mise à niveau, mais pour y remédier, la solution a été de mettre à jour ma variable env. Cookie_domain. Cependant, sur mon nouveau serveur, j'ai essayé tous les domaines auxquels je pouvais penser et cela ne fonctionne toujours pas. 

Voici ce que je sais

  • Le cookie de session n'est pas enregistré sous Chrome -> Application -> Cookies, il apparaît en fait sur ma configuration locale.

  • CSRF-TOKEN obtient une nouvelle valeur à chaque rechargement de page, mais le cookie XSRF-TOKEN est présent et conserve sa valeur à chaque rechargement.

  • Le serveur local et mon nouveau serveur exécutent exactement la même branche git et exécutent Apache 2.4, Laravel 5.4 et PHP 7.1, ce qui me laisse supposer qu'il s'agit d'un problème de configuration. Le serveur local et le serveur exécutent centos 7

  • Chaque demande crée une nouvelle session dans la base de données. Cela se produit pour les demandes get, post et ajax. 

Je suppose que c'est un problème de config quelque part mais je n'en ai aucune idée, toute aide serait grandement appréciée. Si cela me permet de regarder sous ma réponse, les en-têtes de ma page initiale se chargent sid et la session laravel sont présents sous la commande "Set-Cookie", mais ni réellement sauvegardés dans le stockage des cookies de l'application locale. 

Edit/Update Alors au départ, j’ai répondu à ma propre question en disant ce que je pensais être le correctif, mais ce correctif ne fonctionne plus et j’ai ce problème à l’ensemble. La mise à jour de mon problème est donc identique à celle d’avant. Essayer de faire quoi que ce soit crée une nouvelle session, le rechargement et la navigation sur quelques pages ajoute des dizaines de sessions en raison de requêtes ajax et autres activités de ce type.

Ma configuration est la suivante: j’ai 3 serveurs qui fonctionnent sur une image clonée, c’est-à-dire qu’ils sont identiques, mais l’un d’eux est un sous-domaine, development.mysite.com et les 2 autres sont équilibrés pour le site principal mysite .com. Donc, la SEULE explication possible que je puisse trouver est que d’une manière ou d’une autre laravel ne peut pas comprendre ma configuration à cause de mon sous-domaine. J'ai essayé toutes les combinaisons possibles de COOKIE_DOMAIN dans le fichier .env (development.mysite.com, .mysite.com, mysite.com, .development.mysite.com, etc.) et j'ai ajouté des dizaines d'options à mon hôte. profiter. Des idées sur ce que cela pourrait être? 

** Éditer/Mettre à jour # 2 ** En plus de cela, j'ai découvert qu'il pourrait être lié au fait que mon domaine en cours d'utilisation soit un sous-domaine, dans lequel le domaine principal est également en cours d'exécution laravel, le cas échéant, je devrai comprendre comment et pourquoi. 

13
CMOS

J'ai trouvé la solution à cela en 2 parties, je ne savais pas pourquoi cela variait puisqu'il s'agissait du même système d'exploitation et de la même configuration.

Étape 1: assurez-vous que COOKIE_DOMAIN est défini correctement et sans numéro de port (dans .env ou directement dans /config/session.php, selon votre choix). 

Étape 2 assurez-vous que le nom du cookie ('cookie' => 'quel que soit') à l'intérieur de /config/sessions.php N'A PAS de trait de soulignement. Laravel a apparemment eu des problèmes avec cela. 

4
CMOS

Nous avons également lancé cette erreur, et voici ce qui semble résoudre le problème: 

• Vérifiez que votre dossier storage/ a le bon

• Essayez de désactiver tout le Javascript dans vos pages (soit en le désactivant via le navigateur ou dans le code) et assurez-vous que 'http_only' => true,

• Essayez d’utiliser avec et sans https 

• Assurez-vous que la variable SESSION_DRIVER n'est pas null

• Essayez de basculer entre 'encrypt' => false, et 'encrypt' => true,

• Essayez de changer le nom du cookie 'cookie' => 'laravelsession',

• Essayez soit de définir votre SESSION_DOMAIN sur votre domaine actuel OR null.

• Essayez de basculer entre 'secure' => env ('SESSION_SECURE_COOKIE', false) et 'secure' => env ('SESSION_SECURE_COOKIE', true),

Après chaque étape, ce bogue semble être corrigé, mais d'une manière ou d'une autre, le cookie n'est toujours pas défini dans le navigateur jusqu'à ce que nous utilisions également https pour le développement.

Je suis désolé de ne pas être en mesure de fournir une solution à 100%, mais, ayant le même problème EXACT, je souhaitais partager mon expérience avec vous.

5
Mathieu Ferre

La principale cause de ce problème est l'incapacité de laravel à enregistrer les données de session côté serveur.

Avec le fichier en tant que stockage de session, cela peut être et est généralement un problème d’autorisations, [Vérifiez SELINUX si vous êtes sur centos], laravel (c’est-à-dire Apache ou nginx ou quel que soit l'utilisateur avec lequel votre processus s'exécute) devrait avoir l'autorisation de lecture et d'écriture sur le dossier où sont stockés les fichiers de session [généralement le dossier racine/dossier du projet].

Cela peut également se produire lorsque vous utilisez une base de données en tant que stockage de session et qu'une table de sessions est créée manuellement et que vous commettez l'erreur de créer une colonne id de type bigint (20) ou toute autre colonne incompatible.

Encore une fois, cela signifie que Laravel n’a pas pu stocker les données de la session . Consultez ma réponse détaillée à ce sujet ici https://stackoverflow.com/a/45340647/7260022

Et le dernier point concerne les paramètres de cookie et de domaine mentionnés ci-dessus. J'espère que cela aidera à identifier le problème pour toute personne confrontée à ce problème à l'avenir. 

1
Waku-2