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