Inscrivez et connectez vos membres avec OpenID

Vous souhaitez permettre à vos (futurs) membres de s’inscrire et se connecter avec leur compte Google+ ou Yahoo! et vous ne voulez pas débourser 1 centime ? Vous êtes sur la bonne page ! :)

OpenID, la solution

OpenID est un système d’authentification décentralisé qui permet l’authentification unique, ainsi que le partage d’attributs. Il permet à un utilisateur de s’authentifier auprès de plusieurs sites (devant prendre en charge cette technologie) sans avoir à retenir un identifiant pour chacun d’eux mais en utilisant à chaque fois un unique identifiant OpenID.

Il permet aussi d’éviter de remplir à chaque fois un nouveau formulaire en réutilisant les informations déjà disponibles. Ce système permet à un utilisateur d’utiliser un mécanisme d’authentification forte.

Wikipédia

Avantages

  • L’utilisateur ne s’embête plus à retenir ses couples login/mot de passe, il n’a d’ailleurs aucun mot de passe
  • C’est open source et gratuit
  • Simple à mettre en place
  • Vous pourrez obtenir potentiellement plus de membres
  • Google et Yahoo! sont les deux plus gros fournisseurs d’identité acceptant OpenID

Cela se traduit pour l’utilisateur par ce genre d’image que vous connaissez forcément :


Visuel fourni par Janrain

Concrètement, que va-t-on récupérer comme information ? Eh bien au minimum, l’adresse email ! Si vous avez un système de gestion de membres, dans 99% des cas, vous avez l’adresse email du membre enregistrée dans votre base et celle-ci est unique, une adresse = un membre.

Récupérer l’adresse email associée à son compte Google

Il existe une librairie PHP qui va nous faciliter la tâche, elle se nomme LightOpenID.

Vous allez récupérer un fichier master.gz qu’il faut extraire. A l’intérieur se trouve un fichier « master » sans extension, ouvrez-le avec WinRaR et à l’intérieur vous aurez un dossier « lightopenid-lightopenid ».

Vous trouverez un fichier « example-google.php » qui n’est pas complet car il ne vous permet pas de récupérer l’adresse email. Je vous montre ce qu’il faut mettre en lieu et place et avec mes commentaires :

<?php
// On appelle la classe openid
require 'openid.php';

// On lance le processus de récupération d'infos sur le membre
try {
    // Il faut indiquer le nom de domaine
    $openid = new LightOpenID('localhost');
	
    if(!$openid->mode) {
		// Si on demande l'authentification
        if(isset($_GET['login'])) {
			// Ouverture d'une demande d'identité
            $openid->identity = 'https://www.google.com/accounts/o8/id';
			
			// On demande de récupérer l'email
			$openid->required = array('contact/email');
			
			// On redirige vers le fournisseur
            header('Location: ' . $openid->authUrl());
        }
?>
<form action="?login" method="post">
    <button>Login with Google</button>
</form>
<?php
    } elseif($openid->mode == 'cancel') {
		// Si l'utilisateur a refusé de partager son adresse email
        echo 'User has canceled authentication!';
    } else {
		// Si il a accepté, on récupère son adresse
		$data = $openid->getAttributes('contact/email'); 
		$email = $data['contact/email'];
		
		echo 'Votre adresse email est '. $email;
	}
} catch(ErrorException $e) {
    echo $e->getMessage();
}

En cliquant sur le bouton, vous serez redirigé vers Google :


« accounts.google.com »
Si vous avez coché la case de mémorisation, il ne vous posera plus la question, si vous souhaitez voir réapparaître cette demande, il faut se rendre sur cette page > Sécurité > Autorisation des applications et des sites.

Et maintenant ?

Ok c’est super, on a réussi à récupérer l’adresse email, que fait-on avec ?

C’est maintenant à vous de coder un peu, il faut enregistrer le membre ou le connecter, selon le cas.
Je ne vais pas vous donner du code à présent, juste un pseudo algorithme.

Algo

  • 1. – Il faut vérifier en base de données que l’email existe déjà ou non.
    • 1.1 – Si il n’existe pas,
      • 1.1.1 – On l’insère, si on a besoin d’informations supplémentaires, on fait un formulaire où on lui demande son pseudo et autre (attention, souvent le pseudo doit être unique également !).
      • 1.1.2. – On connecte le membre.
    • 1.2. – S’il existe,
      • 1.2.1 – On connecte le membre.

Étant donné que cet algo gère l’inscription et la connexion, rien ne vous empêche de mettre 2 boutons « S’inscrire avec Google » et « Se connecter avec Google » pour que l’utilisateur comprenne bien, mais derrière vous aurez le même lien. ;)

Et si demain mon membre ne veut plus se connecter via un fournisseur d’identité mais avec son adresse email (ou pseudo) et son mot de passe ?

Vous mettez en place la fonction « Mot de passe oublié », lorsqu’il va renseigner son email, vous lui créez un mot de passe aléatoire que vous enregistrez ensuite et vous lui envoyez par mail. Attention à toujours crypter les mots de passe en base !

Et avec Yahoo! ?

Eh bien pour Yahoo!, c’est exactement la même chose, c’est juste le lien qui change : $openid->identity = 'http://me.yahoo.com';

Peut-on récupérer d’autres informations que l’email ?

Oui, et non. Potentiellement vous pouvez demander plein d’informations au fournisseur d’identité, mais il vous donnera seulement ce qu’il veut. Par exemple avec Google, il vous donnera uniquement l’adresse email.
Yahoo! est moins radin, vous pouvez récupérer également le pseudo et le genre (masculin ou féminin). Je n’en ai pas essayé d’autres donc ce que je vous dis n’est pas forcément exhaustif.
Pour faire ce genre de demande, on utilise en fait la norme « axshema ». Vous pouvez voir ici les différentes informations à demander (ne vous attendez pas à une réponse ensuite du fournisseur !).

Comme je sais que ce qui fonctionne avec Yahoo!, il y a 2 arrays à modifier, celui de la demande et celui de la récupération. En prenant bien soin de modifier au préalable l’identifier comme vu au chapitre précédent.

$openid->required = array('namePerson/friendly', 'contact/email', 'person/gender');

$data = $openid->getAttributes('namePerson/friendly', 'contact/email', 'person/gender');


« open.login.yahoo.com »
Quand vous accepterez, le domaine sera automatiquement enregistré sur votre compte Yahoo!. Il ne vous proposera plus cette fenêtre à l’avenir pour ce domaine. Si vous souhaitez supprimer cet enregistrement pour faire des tests supplémentaires (demande d’autres infos, tester le fait de refuser…) il faut se rendre sur cette page.

Qu’en est-il des autres fournisseurs d’identité ?

Vous pouvez voir une petite liste d’autres fournisseurs OpenID avec leurs URL respectives d’appel.

Les deux autres « gros » fournisseurs sont Facebook et Twitter. Ils utilisent tous deux leur propre API et ne passent donc pas par OpenID, malheureusement.
Je ne me suis pas plus intéressé à Twitter quand j’ai vu qu’ils ne partageaient pas l’adresse email, à partir de là, ça limite !

Quant à Facebook, il propose bien plus d’informations que Yahoo!, c’est un peu plus compliqué à mettre en place car il faut créer une application sur son compte et donner certains droits (pour l’adresse email c’est obligatoire). Si cela vous intéresse, il faut se munir du SDK PHP de Facebook. Si j’ai beaucoup de demandes de tuto pour le lien avec Facebook, je verrais ce que je peux faire. *-)

Vous aimerez aussi...