Dans ce tutoriel, nous apprendrons à gérer une reconnexion automatique grâce à PHP.

Petit point définition : il ne s’agit pas d’un bouton magique qui devine quel utilisateur est connecté. Nous sommes plutôt dans un exemple où un utilisateur s’est connecté en cochant une case « Se souvenir de moi » ; après plusieurs jours de non-activité, il est déconnecté, mais en cliquant sur le bouton de connexion, le voilà automatiquement reconnecté sans avoir demandé ses identifiants.

Ce tutoriel demande de savoir ouvrir et fermer une session sécurisée en PHP et créer des cookies en PHP et les gérer.

N’hésitez pas à faire appel à un développeur freelance PHP pour vous faire accompagner dans la mise en place d’un système de connexion automatique en PHP.

 

Déposez gratuitement votre projet sur Codeur.com, recevez une quinzaine de devis et sélectionnez le développeur web idéal.

Trouver un développeur web

Petit point théorique sur la connexion automatique

La méthode est vraiment très simple à comprendre. Dans le formulaire de connexion, l’utilisateur va renseigner son identifiant (adresse e-mail ou pseudonyme), son mot de passe et peut cocher une case « Se souvenir de moi ». Après validation, le script va vérifier que les données de connexion saisies sont bonnes et que l’utilisateur est bien autorisé à se connecter. Une fois que tout est bon, au moment de finaliser la connexion avec les données de session, il y a deux possibilités :

  1. La case n’a pas été cochée : l’id et le token utilisateur sont enregistrés dans les variables de session. Rien de nouveau par rapport aux tutoriels cités plus haut. Théoriquement, une fois qu’utilisateur ferme son navigateur, sa connexion est perdue et il devra renseigner ses informations lors de sa prochaine visite.
  2. La case a été cochée : les variables de session seront renseignées comme d’habitude, mais ce n’est pas tout, car les cookies vont également intervenir. Les cookies ont une durée de vie qui est figée. Ce que l’on va donc faire ici, c’est sauvegarder les informations de connexion dans ces derniers. Le but étant qu’à chaque demande de connexion, avant d’afficher le formulaire, le script vérifie si un cookie de sauvegarder d’identifiants est présent. Si c’est le cas, il simule la saisie des données et connecte automatiquement l’utilisateur.

Cette méthode pose deux problèmes de sécurité qui seront expliqués dans le prochain paragraphe.

 

Gestion de la sécurité

Toutes les questions de sécurité concernent les cookies dans la situation où la case « Se souvenir de moi » a été cochée.

 

« Pourquoi sauvegarder les identifiants de connexion et pas directement l’id de l’utilisateur ? »

Pour raison très importante de sécurité. Admettons que l’utilisateur utilise deux machines ou plus (téléphone et ordinateur ; ou ordinateur de bureau et ordinateur personnel). Si le mot de passe est changé sur l’une des machines, il faut que l’utilisateur ait besoin de se reconnecter sur toutes les autres machines. Stocker son id ne permet pas de repasser par la phase de connexion. Et donc n’importe quelle personne qui utilise une de ses machines peut se connecter sans connaître le nouveau mot de passe.

 

« Stocker le mot de passe dans le cookie, ce n’est pas dans dangereux ? »

Oui et non. Techniquement, pour la voir les cookies d’un site internet, il faut utiliser un script depuis le même nom de domaine. De plus, les cookies sont cryptés par le navigateur. Mais une sécurité en plus n’est jamais de trop, on va favoriser un petit algorithme dont nous sommes les seuls à avoir le secret et qui permet pour crypter le mot de passe.

 

Formulaire et système de connexion

Pour cet exemple, nous allons créer un formulaire sans style. Vous pourrez l’habiller comme vous le souhaitez.

Le formulaire appelle l’url /login.php en envoyant les variables email, password et remember.

<form action="login.php" method="POST">
  <label for="login-email">Adresse e-mail</label>
  <input type="email" id="login-email" name="email" />
  <br />
  <label for="login-password">Mot de passe</label>
  <input type="password" id="login-password" name="password" />
  <br />
  <label>
    <input type="hidden" name="remember" value="0" />
    <input type="checkbox" name="remember" value="1" />
    Se souvenir de moi
  </label>
  <br />
  <button type="submit">Se connecter</button>
</form>-

Pour le système de connexion, utilisez ce que vous avez l’habitude d’utiliser ; sinon nous vous proposons un squelette dans le tutoriel ouvrir et fermer une session sécurisée en PHP.

 

Système de reconnexion automatique en PHP

La partie la plus importante est arrivée.

Partons du principe que l’utilisateur vient de remplir le formulaire de connexion. On arrive donc sur l’url /login.php. Les données POST contiennentemail, password et remember.

Au stade du prochain paragrahe, nous avons déjà vérifié que l’utilisateur est bien dans la base de données, que le duo email / mot de passe est valide, mais nous n’avons pas encore enregistré la variable de session.

Cryptage du mot de passe

Nous pourrions être tenté d’utiliser des fonctions de cryptage déjà en place, comme sha1 ou md5 ; mais c’est méthodes ne sont pas décryptibles. On ne peut donc pas récupérer le mot de passe crypté.

Nous allons devoir créer deux fonctions : encryptPassword et decryptPassword qui vont respectivement crypter et décrypter le mot de passe.

Pour ce faire, dans notre exemple, nous allons utiliser le tableau ASCII. Chaque caractère d’un texte (lettre, numéro, émoticône) est géré par un numéro dit « ASCII ».

Notre algorithme de cryptage va faire la chose suivante :

  1. séparer chaque caractère du mot de passe ;
  2. pour chaque caractère, le transformer en caractère ASCII suivant ;
  3. inverser l’ordre des caractères.
function encryptPassword( $password ) {
    $encrypted = "";
    for( $i = strlen($password) - 1; $i >= 0 ; $i-- ) {
        $encrypted .= chr(ord($password[$i]) + 1);
    }
    return $encrypted;
}

function decryptPassword( $password ) {
    $decrypted = "";
    for( $i = strlen($password) - 1; $i >= 0 ; $i-- ) {
        $decrypted .= chr(ord($password[$i]) - 1);
    }
    return $decrypted;
}

On peut tester ces deux fonctions.

var_dump( encryptPassword("test123") ); // ==> 32utfu
var_dump( decryptPassword("432utfu") ); // ==> test123

Le script de cryptage est ici très simple. Libérez votre imagination pour faire le votre. Essayez de faire un script plus complexe.

Enregistrer des cookies

Nous avons les données, nous avons les fonctions de cryptage. Parfais. Maintenant que l’utilisateur est vérifié, on peut enregistrer le cookie pour une longue durée ; un à deux mois par exemple.

La meilleure chose à faire est de ne créer un seul cookie qui contient :

  1. l’identifiant (ex: $_POST['email'])
  2. un séparateur (ex: //)
  3. le mot de passe crypté (ex: encryptPassword($_POST['password']))

Attention, pour recepter les choix de l’utilisateur, tout cela ne doit être fait que s’il a coché à la case « Se souvenir de moi » !

if( $_POST['remember'] ) {
    $delimiter = "//";
    $cookieString = $_POST['email'] . $delimiter . encryptPassword($_POST['password']);
    $cookieDuration = 60 * 60 * 24 * 60; // 60 jours
    setcookie( 'autoconnection', $cookieString, time() + $cookieDuration );
}

Le cookie est créé, on peut maintenant terminer la connexion en créant la session et en faisant notre redirection s’il y en a une à faire.

Vérifier la connexion automatique avant d’afficher le formulaire de connexion

Le reste va se passer avant l’affichage du formulaire de connexion. En effet, si la connexion automatique est activée, on n’affiche pas le formulaire de connexion, on va plutôt connecter directement l’utilisateur. Pour savoir si l’option est activée, il suffit tout simplement de voir si le cookie est présent. Si c’est le cas, on peut en extraire l’identifiant et le mot de passe.

Si la connexion automatique a échoué, pensez à supprimer le cookie pour éviter que le test se fasse à chaque fois que l’utilisateur charge la page du formulaire de connexion.

if( isset($_COOKIE['autoconnection']) && is_string($_COOKIE['autoconnection']) ) {
    $delimiter = "//";
    $split = explode($delimiter, $_COOKIE['autoconnection']);
    $email = isset($split[0]) ? $split[0] : "";
    $password = isset($split[1]) ? decryptPassword($split[1]) : "";
    // ... Tenter de connecter l'utilisateur
    if( /* l'utilisateur est connecté */ ) {
        // Suite de votre script
    }
    else {
        // Suppression du cookie
        setcookie( 'autoconnection', null, time() - 3600 );
    }
}

 

Déconnexion demandée manuellement par l’utilisateur

Il y a deux types de déconnexions sur le site internet :

  1. La perte de session après une trop longue inactivé ou la fermeture du navigateur. Auquel cas on a le script de connexion automatique qui facilite la reconnexion de l’utilisateur.
  2. La déconnexion manuelle où l’utilisateur clique sur un lien. Dans ce genre de situation, c’est une action volontaire de l’utilisateur. Garder la reconnexion automatique n’est donc pas une bonne chose.

Il est donc très important dans la seconde situation, de penser à supprimer le cookie quand vous déconnectez l’utilisateur.

session_destroy();
setcookie( 'autoconnection', null, time() - 3600 );

 

Notre astuce pour créer un système de connexion automatique en PHP

Créer une connexion automatique est tout un art. Il faut savoir jouer avec les éléments PHP à notre disposition, penser pratique et penser sécurité. Ce tutoriel vous a donné les briques pour l’implémenter à votre structure.

Si ce système est trop complexe (pas assez de connaissances ou structure déjà très compliquée), n’hésitez pas à vous faire accompagner par un développeur spécialisé en PHP. Sur Codeur.com, vous pouvez déposer un projet gratuitement afin de recevoir des devis de développeurs freelances alors n’hésitez pas !