Mettre en place un SSO avec Invision Power Board
By Geoffrey on Wednesday 25 October 2006, 23:02 - Coding - Permalink
Rien de plus simple, tout est déjà prévu. Après l'installation de votre forum IPB, nous allons enregistrer une nouvelle méthode de login. Pour se faire, dans le panneau d'administration, nous nous dirigeons vers Tools and Settings, puis dans Create New Log In du menu Log In Manager. On se retrouve devant un formulaire (assez explicite) que je vous laisse le soin de remplir. On dira juste que nous appellerons cette méthode de login Mon SSO (Log In Title) et qu'il vivra dans le répertoire mon_sso (Log In Files Folder Name). Pour que votre méthode de login soit active, vous devez cocher Log In Enabled, et il est toujours bon de passer en mode On-Fail, ainsi que d'autoriser la création d'utilisateurs (Log In Allow Member Creation), qui créera automagiquement les utilisateurs dans la base locale d'IPB.
Ensuite on met les mains dans le camboui. Dans le répertoire sources/loginauth/ de votre installation, il doit exister un repertoire external/, qui nous servira de base. On commence donc par le dupliquer:
cp -r external mon_sso
Puis on regarde un peu ce qu'il y a dedans:
mon_sso/ auth.php conf.php index.html
Le fichier index.html n'est qu'un empécheur de tourner en rond pour les gens qui explorent un peu trop les arbos web. Le premier fichier qui nous interresse est conf.php, il contient les informations relatives à la base de données distantes. Là encore, c'est assez explicite et bien commenté. Le seul petit truc à savoir est que l'utilisateur qui se connectera à la base a besoin des droits SELECT sur toute la table, pas seulement sur les champs login / pass.
Dans le meilleur des cas, votre SSO est prêt :p Le fichier auth.php contient les méthodes appelées par le gestionnaire d'identification. Vous pouvez avoir besoin de modifier __compare_password, pour la vérification du mot de passe (j'ai par exemple changé la méthode de cryptage qui est md5 par défaut).
A ce stade, vos utilisateurs peuvent s'identifier, mais le forum leur demande quand même leur mail et quelques infos que j'ai oublié. Il est bien évidemment possible d'éviter ça :-)
Dans la méthode authenticate, vers la fin, quand un utilisateur local est créé, la main est passée à la méthode create_local_member, qui redirige ensuite vers l'écran de complétion du compte. C'est là que nous intervenons. La méthode create_local_member n'est pas implémenté dans login_method, mais dans login_core, qui se trouve dans le fichier sources/loginauth/login_core.php, nous commençons par la copier/coller dans notre login_method, puis nous modifions sa déclaration pour lui permettre de recevoir $remote_member en paramètre:
function create_local_member( $remote_member )
{
Cette méthode permet de piocher dans les informations récupérées dans la base distante. Dans la partie Populate member table(s), par défaut, un faux mail est créé:
$email_tmp = $username.'@'.$timenow;
Qu'on peut remplacer par le mail qu'on a déjà potentiellement dans la base distante (disons que le champs s'appelle mail):
$email_tmp = $remote_member['mail'];
On peut ensuite récupérer les champs que l'on veut pour les ajouter au membre local, par exemple dans mon cas, le display_name (nickname chez moi):
$display_name = $remote_member['nickname'];
en les rajoutant dans le tableau $member.
Les deux derniers appels de méthode dans create_local_member, $this->ipsclass->DB->do_insert et $this->ipsclass->print->redirect_screen sont à commenter, et on rajouter avant le bout de code suivant:
$this->return_code = 'SUCCESS'; return;
Retour dans authenticate, dans la partie Got no member - but auth passed - create?, on modifie la première partie du if ainsi:
if ( $this->allow_create )
{
$this->create_local_member( $remote_member );
$this->_load_member($username);
if ( $this->member['id'] )
{
$this->return_code = 'SUCCESS';
}
else
{
$this->return_code = 'NO_USER';
}
return;
}
And voilà, nos utilisateurs peuvent désormais s'identifier sans avoir a re-entrer des informations que l'on possède déjà :-)