Jump to content

Connexion client automatique


Recommended Posts

Bonjour à tous,

J'ai créé un module de devis qui génère un email avec un lien vers une page détails du devis dans le compte client.

Ce lien contient l'identifiant du devis qui me permet de retrouver le client et ainsi de le connecter automatiquement à son compte quand il clique dessus.

J'utilise le code suivant :

$client_devis = new Customer($id_customer) ;
$cookie->id_customer = intval($client_devis->id);
$cookie->customer_lastname = $client_devis->lastname;
$cookie->customer_firstname = $client_devis->firstname;
$cookie->passwd = $client_devis->passwd;
$cookie->logged = 1;
$cookie->email = $client_devis->email;

$this->context->cookie->id_customer = (int)($client_devis->id);
$this->context->cookie->customer_lastname = $client_devis->lastname;
$this->context->cookie->customer_firstname = $client_devis->firstname;
$this->context->cookie->logged = 1;
$client_devis->logged = 1;
$this->context->cookie->is_guest = $client_devis->isGuest();
$this->context->cookie->passwd = $client_devis->passwd;
$this->context->cookie->email = $client_devis->email;
$this->context->customer = $client_devis;
$this->context->cart->secure_key = $client_devis->secure_key;

Tools::redirect($link->getModuleLink('moduledevis','devis'));

La connexion automatique fonctionne correctement sous Prestashop 1.6 avec ce code, mais pas sous Prestashop 1.7.6.7.

Quelqu'un aurait-il une idée du problème ?

Merci d'avance.

Share this post


Link to post
Share on other sites

Attention à la faille de sécurité^^ (n'importe qui qui récupère le lien est logué à la place du client et a accès à toutes ses données)

$link est défini dans votre code ?

Share this post


Link to post
Share on other sites

Merci pour votre retour !

Oui, en effet, il y a une "petite" faille de sécurité, mais c'est le souhait du propriétaire du site et je ne trouve pas d'autres solutions plus sécurisées...

$link est défini en début de code par :

$link = new Link();

 

Share this post


Link to post
Share on other sites

Non pas petite^^ Fuitage de données c'est grave, surtout en se basant juste sur un id_customer...

Vérifier que le client est déjà logué sinon redirect vers login avec paramètre back vers votre module.

Que se passe-t-il lorsque vous cliquez sur votre lien actuellement ? Redirection ? Page d'accueil ? Erreur ?

Que disent les logs serveur ?

Share this post


Link to post
Share on other sites

Bonjour,

Lors de la création du devis, si le client n'existe pas dans la base de données, le module crée automatiquement le compte client avec un mot de passe aléatoire, d'où la connexion automatique.

Je vais intégrer une nouvelle page de vérification, en posant une question au client sur un des paramètres de son compte (par exemple son numéro de tel.), ça sera plus sécurisé déjà.

Sinon, je n'ai pas d'erreur lorsqu'on clique sur le lien, la session ne se crée pas et ça redirige vers la page d'accueil puisque la page du module demande à ce qu'un client soit loggé. Si ensuite on essaie d'accéder au compte, ça demande identifiant et mot de passe.

Share this post


Link to post
Share on other sites

je ne sais pas trop pourquoi vous passez par $client_devis qui n'est pas utilie ici.

Ceci devrait fonctionner

                $customer = new Customer((int)$id_customer);
                if (Validate::isLoadedObject($customer)) {
                    $customer->logged = 1;
                    $this->context->customer = $customer;
                    $this->context->cookie->id_customer = (int)$customer->id;
                    $this->context->cookie->customer_lastname = $customer->lastname;
                    $this->context->cookie->customer_firstname = $customer->firstname;
                    $this->context->cookie->logged = 1;
                    $this->context->cookie->is_guest = $customer->isGuest();
                    $this->context->cookie->passwd = $customer->passwd;
                    $this->context->cookie->email = $customer->email;
                    Tools::redirect($link->getModuleLink('moduledevis', 'devis'));
                }

 

Share this post


Link to post
Share on other sites

En fait, pour que la connexion automatique fonctionne il faut enregistrer une nouvelle session customer.

J'ai utilisé le code que vous m'avez envoyé et y ai ajouté la création de la session, c'est beaucoup plus propre que mon code de départ...

Voici le code final qui fonctionne :

$customer = new Customer((int) $id_customer);
if (Validate::isLoadedObject($customer)) {
  $customer->logged = 1;
  $this->context->customer = $customer;
  $this->context->cookie->id_customer = (int) $customer->id;
  $this->context->cookie->customer_lastname = $customer->lastname;
  $this->context->cookie->customer_firstname = $customer->firstname;
  $this->context->cookie->logged = 1;
  $this->context->cookie->check_cgv = 1;
  $this->context->cookie->is_guest = $customer->isGuest();
  $this->context->cookie->passwd = $customer->passwd;
  $this->context->cookie->email = $customer->email;

  $this->context->cookie->registerSession(new CustomerSession());

  Tools::redirect($link->getModuleLink('moduledevis','devis'));
}	

Merci pour votre aide :)

Ce que je ne comprends pas, c'est que tous les modules (gratuits) de connexion automatique des clients via le back-office utilise le code que vous m'avez envoyé sans créer de session et pour eux ça fonctionne...

Edited by Samantha66 (see edit history)
  • Like 1

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

Cookies ensure the smooth running of our services. Using these, you accept the use of cookies. Learn More