💻 DéveloppementIntermédiaire PS 1.6 PS 1.7 PS 8.x

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.

Publié le 21 mars 2026 6 min de lecture Alexandre Carette

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 :

  1. **L'objet `Context`** : singleton qui contient l'état de la requête courante (client, panier, cookie, langue, etc.)
  2. **Le cookie** : stocke les informations de session côté client pour maintenir l'authentification entre les requêtes
  3. 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 :

    • **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

    Résumé du flux complet

    1. Valider les données du formulaire
    2. Vérifier que l'email n'est pas déjà utilisé
    3. Créer l'objet `Customer` avec mot de passe hashé
    4. Sauvegarder en base avec `$customer->add()`
    5. Affecter les groupes clients
    6. Injecter les données dans `Context` et le cookie
    7. Rattacher le panier existant si nécessaire
    8. Déclencher les hooks PrestaShop
    9. Rediriger le client vers la page souhaitée
#authentification #cookie #context #customer #inscription #module

Questions fréquentes

Tout ce que vous devez savoir sur ce sujet.

Un projet PrestaShop ?

Discutons-en directement.

★★★★★

193 projets livrés

Gratuit & sans engagement — réponse sous 24h

Alexandre Carette

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.