Connecter automatiquement un client après création de compte PrestaShop
Comment authentifier automatiquement un utilisateur après inscription sur PrestaShop 1.6, 1.7 et 8.x. Code complet, contexte cookie et bonnes pratiques sécurité.
En bref : Pour connecter automatiquement un client après création de compte sur PrestaShop, il faut injecter ses données dans le Context et le cookie via `Context::getContext()->cookie->__set()`, rattacher le panier existant avec le `secure_key`, puis déclencher les hooks d'authentification avant de rediriger.
Le besoin : supprimer la friction post-inscription
Sur de nombreuses boutiques PrestaShop, le parcours d'inscription par défaut oblige le client à se connecter manuellement après avoir créé son compte. C'est un point de friction majeur qui peut entraîner des abandons, surtout lorsque vous utilisez un formulaire d'inscription personnalisé dans un module.
L'objectif est simple : dès que le compte est créé via votre code PHP, le client doit être automatiquement authentifié et redirigé vers la page de votre choix, sans étape supplémentaire.
Comprendre le mécanisme d'authentification PrestaShop
PrestaShop gère l'authentification via deux mécanismes complémentaires :
- **L'objet `Context`** : singleton qui contient l'état de la requête courante (client, panier, cookie, langue, etc.)
- **Le cookie** : stocke les informations de session côté client pour maintenir l'authentification entre les requêtes
- **Formulaire d'inscription simplifié** dans un module custom (moins de champs que le formulaire natif)
- **Inscription via popup** ou lightbox sans rechargement de page
- **Import de clients** avec connexion automatique après le premier accès
- **Tunnel de commande personnalisé** avec création de compte intégrée à l'étape de paiement
- **Inscription via réseau social** (OAuth) où le compte est créé programmatiquement
- Valider les données du formulaire
- Vérifier que l'email n'est pas déjà utilisé
- Créer l'objet `Customer` avec mot de passe hashé
- Sauvegarder en base avec `$customer->add()`
- Affecter les groupes clients
- Injecter les données dans `Context` et le cookie
- Rattacher le panier existant si nécessaire
- Déclencher les hooks PrestaShop
- Rediriger le client vers la page souhaitée
Pour qu'un client soit considéré comme connecté, il faut impérativement alimenter les deux : le contexte en mémoire (pour la requête courante) et le cookie (pour les requêtes suivantes).
Le contrôleur natif AuthController utilise une méthode updateContext() qui fait exactement cela. C'est cette logique que nous allons reproduire dans notre propre code.
Implémentation complète
PrestaShop 1.6 : approche avec cookie global
Sur PrestaShop 1.6, la gestion du cookie passe encore partiellement par la variable globale $cookie. Voici l'implémentation complète :
public static function registerAndLogin($firstname, $lastname, $email, $password)
{
// 1. Créer le client
$customer = new Customer();
$customer->firstname = $firstname;
$customer->lastname = $lastname;
$customer->email = $email;
$customer->passwd = Tools::hash($password); // IMPORTANT : hasher le mot de passe
$customer->active = 1;
$customer->newsletter = 1;
if (!$customer->add()) {
return false;
}
$customer->cleanGroups();
$customer->addGroups([Configuration::get('PS_CUSTOMER_GROUP')]);
// 2. Mettre à jour le contexte et le cookie
$context = Context::getContext();
$context->customer = $customer;
$context->cookie->id_customer = (int) $customer->id;
$context->cookie->customer_lastname = $customer->lastname;
$context->cookie->customer_firstname = $customer->firstname;
$context->cookie->passwd = $customer->passwd;
$context->cookie->logged = 1;
$context->cookie->email = $customer->email;
$context->cookie->write();
// 3. Sécuriser le panier
if ($context->cart && Validate::isLoadedObject($context->cart)) {
$context->cart->secure_key = $customer->secure_key;
$context->cart->save();
}
$customer->logged = 1;
// 4. Rediriger
Tools::redirect('index.php?controller=my-account');
}
Point critique : l'appel à $context->cookie->write() est indispensable. Sans lui, les données sont bien présentes en mémoire pour la requête courante, mais ne seront pas persistées dans le cookie du navigateur. Le client apparaîtrait connecté sur la page de redirection immédiate, puis serait déconnecté dès la page suivante.
PrestaShop 1.7 et 8.x : approche modernisée
À partir de PrestaShop 1.7, la variable globale $cookie est dépréciée. Tout passe par Context::getContext()->cookie avec la méthode magique __set(). De plus, PrestaShop 8.x renforce la sécurité du hachage des mots de passe.
public static function registerAndLogin($firstname, $lastname, $email, $password)
{
// 1. Validation des données
if (!Validate::isEmail($email) || !Validate::isName($firstname) || !Validate::isName($lastname)) {
throw new \InvalidArgumentException('Données client invalides');
}
// Vérifier que l'email n'existe pas déjà
if (Customer::customerExists($email)) {
throw new \RuntimeException('Un compte existe déjà avec cet email');
}
// 2. Créer le client
$customer = new Customer();
$customer->firstname = $firstname;
$customer->lastname = $lastname;
$customer->email = $email;
$customer->passwd = Tools::hash($password);
$customer->active = 1;
$customer->newsletter = 1;
$customer->id_default_group = (int) Configuration::get('PS_CUSTOMER_GROUP');
if (!$customer->add()) {
throw new \RuntimeException('Impossible de créer le compte client');
}
$customer->cleanGroups();
$customer->addGroups([(int) Configuration::get('PS_CUSTOMER_GROUP')]);
// 3. Authentifier via le contexte
$context = Context::getContext();
$context->customer = $customer;
$context->cookie->__set('id_customer', (int) $customer->id);
$context->cookie->__set('customer_lastname', $customer->lastname);
$context->cookie->__set('customer_firstname', $customer->firstname);
$context->cookie->__set('passwd', $customer->passwd);
$context->cookie->__set('logged', 1);
$context->cookie->__set('email', $customer->email);
$context->cookie->__set('id_lang', (int) $context->language->id);
// 4. Associer le panier existant au client
if (Validate::isLoadedObject($context->cart)) {
$context->cart->id_customer = (int) $customer->id;
$context->cart->secure_key = $customer->secure_key;
$context->cart->save();
}
$customer->logged = 1;
// 5. Hook pour notifier les autres modules
Hook::exec('actionAuthentication', ['customer' => $customer]);
Hook::exec('actionCustomerAccountAdd', ['newCustomer' => $customer]);
// 6. Rediriger
Tools::redirect($context->link->getPageLink('my-account'));
}
Les erreurs classiques à éviter
Ne pas hasher le mot de passe
Une erreur fréquente consiste à stocker le mot de passe en clair dans l'objet Customer :
// FAUX : mot de passe en clair
$customer->passwd = $password;
// CORRECT : mot de passe hashé
$customer->passwd = Tools::hash($password);
Sans hachage, le client ne pourra jamais se reconnecter manuellement puisque la comparaison du hash échouera systématiquement.
Oublier le `secure_key` du panier
Si un panier existe déjà dans la session (le visiteur a ajouté des produits avant de s'inscrire), il faut impérativement rattacher ce panier au nouveau client via le secure_key. Sans cela, le panier sera considéré comme invalide et le client perdra ses articles.
Ne pas appeler les hooks
De nombreux modules (analytics, emailing, fidélité) écoutent les hooks actionAuthentication et actionCustomerAccountAdd. Si vous ne les déclenchez pas, ces modules ne seront pas notifiés de la création du compte et de la connexion.
Utiliser `global $cookie` sur PrestaShop 1.7+
Sur les versions récentes, l'utilisation de global $cookie provoque des erreurs fatales :
Warning: Creating default object from empty value
Fatal error: Call to undefined method stdClass::write()
Utilisez exclusivement Context::getContext()->cookie avec la méthode __set() à partir de PrestaShop 1.7.
Sécurité : points de vigilance
Validation des entrées
Avant de créer un compte, validez systématiquement les données avec les méthodes Validate de PrestaShop :
if (!Validate::isEmail($email)) {
// Rejeter
}
if (!Validate::isPasswd($password)) {
// Rejeter
}
if (!Validate::isName($firstname) || !Validate::isName($lastname)) {
// Rejeter
}
Protection CSRF
Si votre formulaire est dans un module front-office, protégez-le avec un token CSRF :
// Dans le template Smarty
<input type="hidden" name="token" value="{$token}" />
// Dans le contrôleur
if (!$this->isTokenValid()) {
$this->errors[] = $this->trans('Jeton de sécurité invalide', [], 'Shop.Notifications.Error');
return;
}
Vérification d'unicité de l'email
Toujours vérifier qu'un compte n'existe pas déjà avant d'en créer un :
if (Customer::customerExists($email)) {
// Informer l'utilisateur
}
Cas d'usage courants
Cette technique est particulièrement utile dans les scénarios suivants :
Résumé du flux complet
Questions fréquentes
Tout ce que vous devez savoir sur ce sujet.
Un projet PrestaShop ?
Discutons-en directement.
193 projets livrés
Lire sur le blog

Alexandre Carette
Expert PrestaShop & Architecture E-commerce
Développeur PrestaShop depuis 2014, 193 projets livrés. Je conçois des architectures headless Nuxt + PrestaShop et des outils d'automatisation IA pour les e-commerçants.