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.
Sommaire :
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 :
Cette méthode pose deux problèmes de sécurité qui seront expliqués dans le prochain paragraphe.
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.
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.
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 contiennentpassword
etremember
.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.
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 :
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.
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 :
$_POST['email']
)//
)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.
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 );
}
}
Il y a deux types de déconnexions sur le site internet :
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 );
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 !