Fermer

mai 21, 2018

Comment réparer les problèmes de connexion Magento avec des cookies et des sessions –


Cet article a été créé en partenariat avec Ktree . Nous vous remercions de soutenir les partenaires qui rendent SitePoint possible.

Dans cet article, nous examinons comment les cookies de Magento peuvent créer des problèmes avec les fonctionnalités de connexion du serveur frontal côté client et du backend d'administration. comment cela devrait être résolu.

Ceci est également connu comme le problème de bouclage, car l'écran se redirige vers le même écran, même si le nom d'utilisateur et le mot de passe sont corrects.

Un script est fourni à la fin de l'article ce qui peut aider à détecter quelques-uns des problèmes. N'hésitez pas à utiliser et modifier selon vos besoins.

Qu'est-ce qu'un cookie?

Un cookie est un morceau de texte qu'un serveur web peut stocker sur le disque dur d'un utilisateur, et peut également le récupérer plus tard. Magento utilise des cookies dans les fonctionnalités d'administration de Cart & Backend, et ils peuvent être la source de quelques problèmes quand ils ne peuvent pas se connecter à Magento

Qu'est-ce qu'une session?

Une session est une variable tableau du côté serveur. stocke les informations à utiliser sur plusieurs pages. Par exemple, les éléments ajoutés au panier sont généralement enregistrés dans les sessions et lorsque l'utilisateur parcourt la page de paiement, ils sont lus à partir de la session.

Les sessions sont identifiées par un identifiant unique. Son nom change selon le langage de programmation – en PHP, il s'appelle un 'identifiant de session PHP'. Comme vous l'avez peut-être deviné, le même ID de session PHP doit être stocké comme cookie dans le navigateur client pour être mis en relation.

Magento's storage of sessions

Magento peut stocker des sessions via plusieurs fournisseurs de session. Fichier de configuration Magento à app / etc / local.xml . Ces fournisseurs de sessions peuvent être choisis ici

Fichier



    

Base de données

Permettre aux sessions de se stocker dans la base de données est fait dans /app/etc/local.xml en ajoutant .

Les applications Magento stockent des sessions dans la table Core _session

Redis

 db 
                               
              127.0.0.1     
         6379 
    

MemCache

 session_save> 


Utilisation de Magento

Magento utilise deux cookies différents nommés 'frontend' et 'adminhtml'. Le premier est créé quand une page est parcourue. Le même cookie est également mis à jour lorsque le client se connecte et le suivant est créé lorsqu'un utilisateur backend est connecté. Vous pouvez vérifier si les cookies ont été créés en cliquant sur Inspect Element> Application comme dans l'image ci-dessous (de Chrome):

Les cookies sont configurés dans Magento via le menu Configuration admin – System> Configuration> General> Web .

Problème: Connexion échoue et redirige vers la page de connexion

Si vous n'avez pas rencontré ce problème, alors vous n'avez pas suffisamment travaillé avec Magento!

Voici comment cela se passe généralement: lorsque vous vous connectez en entrant votre nom d'utilisateur et mot de passe, vous serez redirigé vers la même page de connexion et l'URL, et votre navigateur est ajouté avec ID nonce. Cela se produit à la fois pour l'interface client et la connexion back-end Magento.

Voyons quelques raisons pour lesquelles cela se produit et comment nous devrions résoudre ces problèmes.

Raison n ° 1: le domaine de cookie ne correspond pas server domain

Supposons que votre site Magento soit example.com et que le domaine des cookies dans Magento soit configuré comme xyz.com .

Dans ce scénario les deux cookies Magento seront configurés Valeur du domaine as xyz.com mais pour valider la session, Magento considérera le domaine par lequel le site a été accédé – dans ce cas example.com . Comme il ne sera pas en mesure de trouver une session active avec la valeur de domaine example.com il redirigera l'utilisateur vers la page de connexion même si des informations d'identification valides sont fournies.

app / code / core / Mage / Core / Model / Session / Abstract.php

Après connexion ou déconnexion, le système Magento va régénérer la session en utilisant le script suivant:

 public function renewSession ()
    {
        $ this-> getCookie () -> delete ($ this-> getSessionName ());
        $ this-> regenerateSessionId ();

        $ sessionHosts = $ this-> getSessionHosts ();
        $ currentCookieDomain = $ this-> getCookie () -> getDomain ();
        if (is_array ($ sessionHosts)) {
            foreach (array_keys ($ sessionHosts) en tant que $ host) {
                // Supprimer les cookies avec le même nom pour les domaines parents
                if (strpos ($ currentCookieDomain, $ host)> 0) {
                    $ this-> getCookie () -> delete ($ this-> getSessionName (), null, $ host);
                }
            }
        }

        return $ this;
    }

app / code / core / Mage / Core / Model / Session / Résumé / Varien.php

Magento validera la session pour chaque requête avec la méthode suivante:

 public function init ($ namespace, $ sessionName = null)
    {
        if (! isset ($ _ SESSION)) {
            $ this-> start ($ sessionName);
        }
        if (! isset ($ _ SESSION [$namespace]))
            $ _SESSION [$namespace] = array ();
        }

        $ this -> _ data = & $ _ SESSION [$namespace];

        $ this-> validate ();
        $ this-> revalidateCookie ();

        return $ this;
    }

Vous pouvez normalement le voir lorsque vous migrez votre instance Magento d'un domaine à un autre, par exemple de Production à Staging, et oubliez de changer le domaine de cookie.

Note: vous pouvez exécuter le script cookieTest.php fourni, qui valide le nom du domaine de cookie du serveur et ce qui est défini dans la configuration de Magento

Solution:

Modifier le domaine de cookie via le menu admin de configuration. Allez dans Système> Configuration> Général> Web comme dans la capture d'écran

Vous pouvez également changer cela en exécutant ces requêtes SQL.

Pour valider le domaine cookie, utilisez cette requête select pour obtenir le configuration:

 SELECT * FROM core_config_data WHERE chemin d'accès = 'web / cookie / cookie_domain';

Après avoir exécuté cette requête, nous obtiendrons les résultats. Vérifiez que la colonne 'value' est la même que votre domaine. Mettez à jour la valeur si elle n'est pas la même que votre domaine.

Pour mettre à jour le domaine cookie, utilisez cette requête:

 UPDATE core_config_data SET VALUE = "domain.com" WHERE chemin = 'web / cookie / cookie_domain';

Raison n ° 2: plusieurs sous-domaines utilisés et la configuration des cookies de Magento est incorrecte

Supposons que votre site soit example.com . La connexion à example.com/admin fonctionne très bien.

Mais sur votre site de mise en scène / QA, par exemple staging.example.com/admin vous ne pouvez pas vous connecter sans supprimer tous les cookies. Le système peut autoriser les connexions à staging.example.com mais lorsque nous nous connectons à example.com/admin votre prochain clic sur staging.example.com vous renvoie à la page de connexion. Un comportement similaire est également observé pour les clients utilisant la connexion frontale

Solution 1

Option A: Si votre domaine principal et vos sous-domaines sont hébergés sur le même serveur

  • Modifier le domaine cookie via le menu Configuration admin . Allez dans Système> Configuration> Général> Web selon la capture d'écran.
  • Voir si le domaine des cookies est exemple.com ou .example.com (notez la période devant). Si non, définissez-le sur .example.com .

Option B: Si votre domaine principal et vos sous-domaines sont hébergés sur des serveurs différents

  • Modifiez le domaine Cookie via le menu Configuration admin. Allez dans Système> Configuration> Général> Web selon la capture d'écran.
  • Voir si le domaine des cookies est www.example.com ou .www.example .com (notez la période devant). Sinon, définissez-le sur .www.example.com .
  • Dans la boutique test.example.com définissez le domaine de cookie sur .test.example. com sur l'environnement de test

Vous pouvez également modifier cela en exécutant ces requêtes sql

Pour valider le domaine cookie, utilisez la requête select suivante pour obtenir la configuration:

 SELECT * FROM core_config_data WHERE path = 'web / cookie / cookie_domain';

Après l'exécution de la requête ci-dessus, nous obtiendrons les résultats. Vérifiez si la colonne 'value' est la même que votre domaine ou non. Mettez à jour la valeur si ce n'est pas la même chose que votre domaine.

Pour mettre à jour le domaine cookie, utilisez la requête suivante:

 UPDATE core_config_data SET VALUE = "domain.com" WHERE chemin = 'web / cookie / cookie_domain';

Solution 2

Vérifiez si votre fichier php.ini a le même domaine de cookie que celui de votre configuration Magento – si ce n'est pas le même que celui de Magento, comme ci-dessous:

 cookie  _domain = example.com

Solution 3

Cette approche n'est pas recommandée, mais si toutes les options échouent, vous pouvez essayer ce code, en modifiant l'option en modifiant le nom du cookie adminhtml pour les sous-domaines. Copiez le fichier action.php et conservez-le dans le même dossier que local pour pouvoir remplacer votre fichier de code principal.

Il y a deux modifications à apporter dans le fichier app / code / core / Mage / Core / Contrôleur / Varien / Action.php .

Dans la fonction preDispatch modifiez ces lignes:

 / ** @var $ session Mage_Core_Model_Session * / $ session = Mage :: getSingleton ('core / session', array ('nom' => $ this -> _ sessionNamespace)) -> start ();

À:

 $ namespace = $ this -> _ sessionNamespace. ($ _ SERVER ['SERVER_NAME'] == 'subdomain.example.com'? '_ Sous-domaine': ''); / ** @var $ session Mage_Core_Model_Session * / $ session = Mage :: getSingleton ('core / session', tableau ('name' => $ namespace)) -> start ();

Dans la fonction setRedirectWithCookieCheck modifiez:

 / ** @var $ session Mage_Core_Model_Session * / session = Mage :: getSingleton ('core / session', array ('nom' => $ this -> _ sessionNamespace));

À:

 $ namespace = $ this -> _ sessionNamespace. ($ _ SERVER ['SERVER_NAME'] == 'subdomain.example.com'? '_ Sous-domaine': ''); / ** @var $ session Mage_Core_Model_Session * / $ session = Mage :: getSingleton ('core / session', tableau ('name' => $ namespace));

Après cela, recherchez le texte suivant dans tous les fichiers:

 Mage :: getSingleton ('core / session', array ('nom' => 'adminhtml')); `

Si des occurrences sont trouvées, remplacez-les par:

 Mage :: getSingleton ('core / session', array ('nom' => 'adminhtml'. ($ _ SERVER ['SERVER_NAME'] == 'subdomain.example .com '?' _ 'subdomain': ''))));

Raison n ° 3: Double cookies frontaux provoquant des problèmes de connexion intermittents

Dans quelques scénarios, il est possible que le système crée plusieurs cookies frontaux, ce qui empêche le système de vous permettre de vous connecter ..

Scénario 1

Lorsque votre système Magento a la même configuration pour votre domaine principal et votre sous-domaine dans la configuration de Magento, et si l'utilisateur se connecte aux deux sites, Magento crée deux cookies. L'un a la valeur du domaine définie avec le domaine principal et une autre avec le sous-domaine. En tant que tel, nous aurons deux sessions cookie frontales, donc nous ne serons pas en mesure de se connecter au système.

Solution

Modifiez le paramètre Cookie Domaine à .example.com pour les configurations de domaine et de sous-domaine

Scénario 2

Dans ce scénario, disons que dans votre php.ini aucun domaine de cookie n'est configuré et la valeur de domaine Magento de example.com est configurée. Maintenant, lorsque l'utilisateur se connecte via www.example.com le système crée un cookie avec une valeur de domaine de example.com à partir de la configuration de Magento. Lorsque l'utilisateur se déconnecte, Magento régénère le cookie avec une valeur de domaine à partir de l'URL accédée (ie www.example.com ), puisque dans php.ini aucun domaine de cookie n'a été spécifié . Notez que si l'utilisateur se connecte en utilisant example.com ou qu'un domaine cookie est configuré dans php.ini aucun problème ne se posera.

Solution 1

Ajouter un cookie domain à votre fichier php.ini qui est le même que votre config Magento.

 session.cookie  _domain = example.com

Solution 2

Modifiez le domaine de cookie en .example.com pour les configurations de domaine et de sous-domaine.

Remarque: Utilisez notre script cookieTest.php pour voir si

Raison n ° 4: Impossible de créer (lire) l'ID de session

 Erreur récupérable: session  _regenerate  _id (): Impossible de créer (lire) ID de session: utilisateur (chemin: / var / lib / php / sessions) dans app / code / core / Mage / Core / Modèle / Session / Abstract / Varien.php à la ligne 492

Il s'agit d'une erreur que vous pouvez voir dans le journal des exceptions, et qui pourrait se produire uniquement pour PHP7, car PHP7 effectue une vérification stricte des types.

La solution consiste à changer la fonction de lecture du noyau de Magento par typecasting. Plus d'informations à ce sujet ici .

 public function read ($ sessId) {
// retourne $ data;
return (string) $ data;
}

Raison n ° 5: le fichier de données de session n'est pas créé par votre uid

 Attention: session_start (): le fichier de données de session n'est pas créé par votre uid dans app / code / core / Mage / Core / Model / Session / Abstract /Varien.php à la ligne 125

Solution 1

Cette erreur se produit si vous enregistrez des sessions dans des fichiers et que le dossier ou les fichiers ne disposent pas de l'autorisation utilisateur du serveur Web. Ainsi, dans le cas de nginx, si votre serveur Web est www-data, vous devez attribuer la propriété au dossier en utilisant:

 sudo chown -R www-data: www-data

Solution 2

Si vous exécutez Vagrant, vous devrez peut-être vous assurer ou modifier le chemin de la session du fichier.

Solution 3

Une autre raison est qu'il peut y avoir quelques anciennes sessions dans le

] var / sessions dossier – supprimez-les et vérifiez si cela résout le problème.

Note: Si vous avez la possibilité d'utiliser différents fournisseurs de sessions, passez à un autre. Par exemple, allez de Redis au fichier. Effacez votre dossier var / cache et voyez si cela fonctionne – et encore, essayez ceci seulement dans votre environnement de développement.

Un script PHP pour détecter les problèmes de cookies

 <? Php
ini_set ('display_errors', 1);
$ mageFileName = getcwd (). '/app/Mage.php';
require $ mageFileName;
Mage :: app ();
echo " Configuration du domaine du cookie du serveur: " .ini_get ('session.cookie_domain'). "
"; foreach (Mage :: app () -> getStores () en $ magasin) {     écho "". $ store-> getName (). "
";     $ configCookieDomain = Mage :: getStoreConfig ('web / cookie / cookie_domain', $ store-> getId ());     $ storeConfigUrl = Mage :: getStoreConfig ('web / unsecure / base_url', $ store-> getId ());     $ sourceUrl = parse_url ($ storeConfigUrl);     $ storeDomain = $ sourceUrl ['host'];     $ cookieDomainResult = ($ configCookieDomain == $ storeDomain || $ configCookieDomain == '.'. $ storeDomain)? "" : "ne pas";     echo "Config cookie Domaine:". $ configCookieDomain. "et Store Domain:". $ storeDomain. "". $ cookieDomainResult. "configuré correctement
"; } // echo " Demande de cookies: "; $ requestCookie = Mage :: app () -> getRequest () -> getHeader ('cookie'); $ requestCookieArr = explode (';', $ requestCookie); $ sessionIds = array (); foreach ($ requestCookieArr as $ requestCookieItem) {     $ cookieValue = explode ('=', $ requestCookieItem);     // echo $ requestCookieItem. "
";     if (trim ($ cookieValue [0]) == 'frontend' || trim ($ cookieValue [0]) == 'adminhtml') {         $ cookieName = trim ($ cookieValue [0]);         $ sessionId = trim ($ cookieValue [1]);         $ sessionIds [$cookieName][] = $ sessionId;     } } $ areas = array ("frontend", "adminhtml"); foreach ($ zones comme $ area => $ cookieName) {     echo " validant". $ cookieName. "cookie
";     $ cookieExpires = Mage :: getModel ('core / cookie') -> getLifetime ($ cookieName);     $ cookiePath = Mage :: getModel ('core / cookie') -> getPath ($ cookieName);     $ cookieDomain = Mage :: getModel ('core / cookie') -> getDomain ($ cookieName);     $ cookieSecure = Mage :: getModel ('core / cookie') -> isSecure ($ cookieName);     $ cookieHttpOnly = Mage :: getModel ('core / cookie') -> getHttponly ($ cookieName);     echo "Cookie Lifetime:". $ cookieExpires. "
";     echo "Chemin du cookie:". $ cookiePath. "
";     echo "Cookie Domaine:". $ cookieDomain. "
";     echo "Cookie est sécurisé:". $ cookieSecure. "
";     echo "Cookie Httponly:". $ cookieHttpOnly. "
";     if (count ($ sessionIds [$cookieName])> 1) {         echo " Nous avons". count ($ sessionIds [$cookieName]). "". $ cookieName. "Cookies avec des valeurs: ". implode (',', $ sessionIds [$cookieName]). "
";         // $ encryptedSessionId = Mage :: getSingleton ("core / session") -> getEncryptedSessionId ();         $ encryptedSessionId = Mage :: getModel ('core / cookie') -> get ($ cookieName);         echo "Valeur originale du cookie:". $ encryptedSessionId. "
";         echo "Veuillez vérifier la configuration du domaine de cookie du sous-domaine et du site principal

";     } } ?>

Sortie:

 Magento Store FR
Config cookie Domaine: staging.abc.com et Store Domain: staging.abc.com configurés correctement
Magento Store FR
Config cookie Domaine: staging.abc.com et Store Domain: staging.abc.com configurés correctement
validation du cookie de frontend
Durée de vie des cookies: 31536000
Chemin du cookie: /
Domaine du cookie: staging.zeb.be
Le cookie est sécurisé
Cookie Httponly: 1
validation du cookie adminhtml
Durée de vie des cookies: 31536000
Chemin du cookie: /
Domaine du cookie: staging.zeb.be
Le cookie est sécurisé
Cookie Httponly: 1




Source link