Un article à l’arrache pour poster une solution à un problème rare mais qui m’a fait chier des mois durant. Quand je voulais me loguer sur l’interface d’admin d’un Prestashop, hébergé sur un serveur OVH, le système me renvoyait systématiquement sur la page de login, même quand les bons identifiants étaient saisis. Étrangement, ce phénomène ne se produisait pas quand j’utilisais le nom d’hôte en vpsXXXXX dans l’URL (en 1.6, parce qu’en 1.7, ça ne marchait pas dès que le nom de domaine était configuré).
OVH propose des VPS avec Prestashop installé. Prestashop dispose d’un mécanisme de sécurité sur la page d’admin qui vérifie que les requêtes d’une même session proviennent de la même adresse IP.
OVH propose un système de certificat SSL pour HTTPS facile à mettre en place. Il remplace l’adresse cible de votre nom de domaine (appelons-la adresse X) par une autre (appelons-la adresse SSL). Sur cette adresse SSL, un système de relais transparent est mis en place pour que l’utilisateur reçoive le contenu de l’adresse X tout en voyant le bon certificat SSL qui correspond au nom de domaine (qui pointe sur l’adresse SSL). En réalité, le client communique uniquement avec l’adresse SSL. C’est cette dernière qui communique avec l’adresse X. C’est-à-dire, dans mon cas, le serveur sur lequel se trouve Prestashop. Ce que j’ignorais jusqu’à aujourd’hui, c’est que ce relais communique avec l’adresse X depuis plusieurs adresses IP sources différentes.
Et fatalement, les deux mécanismes de sécurité, celui de Prestashop et celui du SSL OVH, se télescopent. L’interface d’admin devient inaccessible en HTTPS depuis le domaine configuré. Selon la configuration, elle peut carrément devenir inaccessible tout court.
Une solution consiste à désactiver à la source le mécanisme de sécurité de Prestashop de vérification des adresses IP. Pour cela, dans les fichiers classes/Cookie.php et classes/Employee.php, commentez la ligne suivante :
&& (!isset(Context::getContext()->cookie->remote_addr) || Context::getContext()->cookie->remote_addr == ip2long(Tools::getRemoteAddr()) || !Configuration::get('PS_COOKIE_CHECKIP'))
Videz vos cookies et ça devrait le faire.