questo sarà lungo ...
Ho un brutto caso di errore di accesso irregolare, a causa della gestione errata dei cookie. Prima di tutto, gestisco un negozio chiuso (B2B) in cui i clienti devono accedere prima di poter vedere il catalogo. Ogni accesso non registrato viene reindirizzato alla pagina di accesso, ma di tanto in tanto il cliente non può accedere anche se nome utente e password sono corretti. Dico "nome utente" perché utilizzo l'estensione Diglin_Username e il plug-in StoreRestricition per ottenere il comportamento desiderato. Quello che succede è che a volte ho trovato due diversi set di cookie lasciati da Magento e si riferiscono a due domini diversi (.www.abc.com e .abc.com per esempio).
Dopo aver letto questo articolo del grande Alan Storm sulla prima istanza della sessione e aver trovato il temuto cookie PHPSESSID nel mio browser, ho approfondito il problema.
Quello che ho trovato è bifronte. Per prima cosa ho inserito una chiamata Mage :: Log () nella funzione start () nella classe Mage_Core_Model_Session_Abstract_Varien per registrare i vari tentativi fatti da Magento per avviare una nuova sessione e ho notato che dopo la prima chiamata Mage :: run () il preDispatch () , i metodi dispatch () e postDispatch () della classe Mage_Core_Controller_Front_Action vengono richiamati nella consueta sequenza ma sembra che quando postDispatch () viene eseguito, non riesca a trovare la sessione avviata da preDispatch () e procede alla creazione di una nuova sessione. A questo proposito ho trovato una differenza nel codice tra Magento 1.7.xe la versione 1.8.x e penso che forse potremmo occuparci del problema:
Magento 1.7.x - Classe Mage_Core_Model_Session_Abstract_Varien:
public function start($sessionName=null)
{
if (isset($_SESSION)) {
return $this;
}
.
.
}
Magento 1.8.x - Classe Mage_Core_Model_Session_Abstract_Varien:
public function start($sessionName=null)
{
if (isset($_SESSION) && !$this->getSkipEmptySessionCheck()) {
return $this;
}
.
.
}
Non riesco proprio a trovare dove impostare la proprietà SkipEmptySessionCheck, quindi ho finito per patchare la classe Mage_Core_Controller_Front_Action in questo modo:
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;
}
avere postDispatch () che non chiama Mage :: getSingleton ('core / session') (che avrebbe creato una nuova sessione) se non riuscisse a trovare una sessione già avviata. Così tanto tempo per il cookie PHPSESSID e tutto fatto, ho pensato ...
Ma non è così. Ora mi sono liberato dei cookie di PHPSESSID ma ho comunque trovato due diversi set di cookie (erroneamente) salvati nel browser. Solo cancellando i cookie sbagliati posso accedere con successo, o vengo reindirizzato alla pagina di accesso senza nemmeno un messaggio. Ho provato a dichiarare esplicitamente il dominio dei cookie nella configurazione del sistema, ma questo non ha risolto il problema.
Nel profondo della base di codice di nuovo, e ho scoperto che nei vari punti in cui Magento imposta un cookie ci vuole il dominio da usare dalla funzione getDomain () nella classe Mage_Core_Model_Cookie:
public function getDomain()
{
$domain = $this->getConfigDomain();
if (empty($domain)) {
$domain = $this->_getRequest()->getHttpHost();
}
return $domain;
}
Ora, se guardi la pagina che ricevi da Magento nel tuo browser, puoi trovare nella sezione 'head' qualcosa del genere:
<script type="text/javascript">
//<![CDATA[
Mage.Cookies.path = '/';
Mage.Cookies.domain = '.www.abc.com';
//]]>
</script>
Queste linee provengono da 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>
e a sua volta questo codice fa riferimento alla funzione getDomain () nella classe Mage_Page_Block_Js_Cookie:
public function getDomain()
{
$domain = $this->getCookie()->getDomain();
if (!empty($domain[0]) && ($domain[0] !== '.')) {
$domain = '.'.$domain;
}
return $domain;
}
Quindi, se imposto il dominio dei cookie nella configurazione del sistema come, ad esempio, "www.abc.com", finisco con:
Mage.Cookies.domain = '.www.abc.com'
e trovando nel mio browser entrambi i cookie "www.abc.com" e ".www.abc.com" ho pensato "ok, imposterò" .abc.com "nella configurazione del sistema e finirò sempre con" .abc.com 'cookies !! "...
Ma niente da fare. Ora nella mia pagina HTML ricevo sempre ".abc.com", ma ho comunque erroneamente ricevuto un cookie "www.abc.com" e nessun accesso.
Sono perplesso e il mio cliente sta iniziando a pensare che non sono così bravo come pensava (lo sto iniziando a pensare anch'io ...) :(
Alcuni di voi ragazzi (e ragazze) hanno qualche suggerimento?
AGGIORNAMENTO: Ho visto qualcuno riferire problemi con sessioni e cookie all'uso di Varnish come cache per Magento. Dato che sto usando anche Varnish, proverò se disabilitandolo il problema può essere risolto.