esta será larga ...
Tengo un caso grave de error de inicio de sesión errático, debido a la gestión incorrecta de cookies. En primer lugar, estoy administrando una tienda cerrada (B2B) en la que los clientes deben iniciar sesión antes de que puedan ver el catálogo. Cada acceso no registrado se redirige a la página de inicio de sesión, pero de vez en cuando el cliente no puede iniciar sesión incluso si el nombre de usuario y la contraseña son correctos. Digo 'nombre de usuario' porque uso la extensión Diglin_Username y el complemento StoreRestricition para lograr el comportamiento deseado. Lo que sucede es que a veces encontré dos conjuntos diferentes de cookies dejados por Magento, y se refieren a dos dominios diferentes (.www.abc.com y .abc.com, por ejemplo).
Después de leer este artículo del gran Alan Storm sobre la creación de instancias en las primeras sesiones, y encontrar la temida cookie PHPSESSID en mi navegador, investigué con cierta profundidad el problema.
Lo que encontré es de dos caras. Primero puse una llamada Mage :: Log () en la función start () en la clase Mage_Core_Model_Session_Abstract_Varien para registrar los diversos intentos realizados por Magento para iniciar una nueva sesión y noté que después de la primera invocación de Mage :: run (), preDispatch () , los métodos dispatch () y postDispatch () de la clase Mage_Core_Controller_Front_Action se invocan en la secuencia habitual, pero parece que cuando se ejecuta postDispatch () no puede encontrar la sesión iniciada por preDispatch () y procede a crear una nueva sesión. A este respecto, encontré una diferencia en el código entre la versión 1.7.xy 1.8.x de Magento y creo que tal vez podría solucionar el problema:
Magento 1.7.x - Clase Mage_Core_Model_Session_Abstract_Varien:
public function start($sessionName=null)
{
if (isset($_SESSION)) {
return $this;
}
.
.
}
Magento 1.8.x - Clase Mage_Core_Model_Session_Abstract_Varien:
public function start($sessionName=null)
{
if (isset($_SESSION) && !$this->getSkipEmptySessionCheck()) {
return $this;
}
.
.
}
Sin embargo, no puedo encontrar dónde establecer la propiedad SkipEmptySessionCheck, así que terminé parcheando la clase Mage_Core_Controller_Front_Action de esta manera:
public function postDispatch()
{
parent::postDispatch();
if (!$this->getFlag('', self::FLAG_NO_START_SESSION )) {
if (session_id()) {
Mage::getSingleton('core/session')->setLastUrl(Mage::getUrl('*/*/*', array('_current'=>true)));
}
}
return $this;
}
tener postDispatch () sin llamar a Mage :: getSingleton ('core / session') (que habría creado una nueva sesión) si no puede encontrar una sesión ya iniciada. Adiós a la cookie PHPSESSID y todo listo, pensé ...
Pero no es asi. Ahora me deshice de la cookie PHPSESSID pero aún tengo que pasar a dos conjuntos diferentes de cookies (erráticamente) guardados en el navegador. Solo borrando las cookies incorrectas puedo iniciar sesión con éxito, o me redirigen a la página de inicio de sesión sin siquiera un mensaje. Traté de establecer el dominio de cookies explícitamente en la configuración del sistema, pero esto no resolvió el problema.
Profundamente en la base de código nuevamente, y descubrí que en los diversos lugares cuando Magento establece una cookie, toma el dominio para usar desde la función getDomain () en la clase Mage_Core_Model_Cookie:
public function getDomain()
{
$domain = $this->getConfigDomain();
if (empty($domain)) {
$domain = $this->_getRequest()->getHttpHost();
}
return $domain;
}
Ahora, si mira la página que obtiene de Magento en su navegador, puede encontrar en la sección 'cabeza' algo como esto:
<script type="text/javascript">
//<![CDATA[
Mage.Cookies.path = '/';
Mage.Cookies.domain = '.www.abc.com';
//]]>
</script>
Estas líneas provienen de app / design / frontend / base / default / template / page / js / cookie.phtml:
<script type="text/javascript">
//<![CDATA[
Mage.Cookies.path = '<?php echo $this->getPath()?>';
Mage.Cookies.domain = '<?php echo $this->getDomain()?>';
//]]>
</script>
y a su vez este código hace referencia a la función getDomain () en la clase Mage_Page_Block_Js_Cookie:
public function getDomain()
{
$domain = $this->getCookie()->getDomain();
if (!empty($domain[0]) && ($domain[0] !== '.')) {
$domain = '.'.$domain;
}
return $domain;
}
Entonces, si configuro el dominio de cookies en la configuración del sistema como, por ejemplo, 'www.abc.com' termino con:
Mage.Cookies.domain = '.www.abc.com'
y al encontrar en mi navegador las cookies 'www.abc.com' y '.www.abc.com' pensé, "ok, estableceré '.abc.com' en la configuración del sistema y siempre terminaré con ' .abc.com 'cookies !! "...
Pero de ninguna manera. Ahora en mi página HTML siempre obtengo '.abc.com' pero aun así recibí una cookie 'www.abc.com' y no inicié sesión.
Estoy perplejo, y mi cliente está empezando a pensar que no soy tan bueno como él pensaba que era (también estoy empezando a pensar que ...) :(
¿Algunos de ustedes (y chicas) tienen alguna pista?
ACTUALIZACIÓN: He visto a alguien relacionando problemas con las sesiones y las cookies con el uso de Varnish como caché para Magento. Como también estoy usando Varnish, intentaré si deshabilitarlo el problema se puede resolver.