Follow me
RSS feed
My sources
My Viadeo

Authentification Wordpress

Greg | 18 Nov 2010

Projets Cela fait exactement un an que ce site est passé de Wordpress à Jekyll. Mais c'est un pur hasard si je publie justement aujourd'hui, un post qui parle de Wordpress. En effet, si je n'utilise plus ce moteur de blog à titre personnel, je continue à y toucher dans le cadre de mon travail.

Sans vous encombrer la tête avec mon boulot, il faut savoir que VIDAL propose un site protégé1, réservé aux éditeurs de logiciels. Ce site, propulsé par Wordpress, permet d'accéder à de l'information sur les APIs VIDAL, donne des solutions techniques pour mettre en place certaines fonctions et permet de télécharger les dernières versions du SDK et sa documentation (au format HTML).

Associé à ce site, j'ai également développé une application qui simule la mise en place d'une ordonnance et son analyse en lien avec les données d'un patient.

L'idée qui sous-tend mon poste d'aujourd'hui, vient de la volonté de mettre en ligne la documentation du SDK et l'outil de démonstration. Malheureusement, la documentation est conçue par l'équipe de développement au format HTML et il n'est pas possible de l'importer simplement dans notre Wordpress. Pour ce qui est de l'outil de démo, mettre en place un système d'authentification serait facile, mais cela supposerait soit de gérer l'ensemble des comptes en double ou d'aller taper directement dans la base Wordpress. La première solution n'est pas envisageable quant à la seconde, bien que, facile à mettre en place, elle oblige à aller jouer avec du SQL.

J'ai donc cherché si nous ne pourrions pas utiliser un système d'authentification unifié.

Première solution envisagée : utiliser le plugin WP-RESTful. En effet, ce plugin, associé avec WP-RESTful Users Plugin, permet de transformer Wordpress en provider OAuth. C'est certes un peu overkill pour ce que nous voulons faire, mais cela répondait bien à notre besoin. Malheureusement, WP-RESTful souffre de pas mal de bugs de jeunesse. Et malgré plusieurs échanges très constructifs avec son concepteur, les corrections nécessaires nous obligeant à mettre les mains dans un code un peu lourd à modifier pour un besoin aussi simple2.

La seconds piste envisagée consiste à utiliser les APIs XML-RCP de Wordpress. Chacune de ces APIs s'utilise en passant en paramètre le login et le mot de passe d'un utilisateur à un moment ou à un autre. Sachant cela, n'importe laquelle nous permet de vérifier une authentification.

Il ne reste plus qu'à ajouter un système d'authentification à notre outil de démo, et d'utiliser ce même système pour protéger les pages de la documentation. Quelques lignes de code avec Capcode ont résolu cela facilement. Il suffit, dans ce système, de gérer une session pour déterminer si l'utilisateur s'est loggué, et agir en conséquence. Malheureusement, si vous regardez le retour des APIs XML-RCP de Wordpress, vous comprendrez rapidement que nous n'y trouverons rien de vraiment intéressant pour nous. L'idéal dans notre cas serait d'avoir l'ID de l'utilisateur.

J'ai donc pris le parti de créer un plugin ajoutant une méthode aux APIs XML-RCP de Wordpress et permettant de savoir si un compte utilisateur est valide, soit en passant un couple login/password, soit en passant un ID utilisateur :

 1 <?php
 2 /**
 3  * @package RCP_Autz
 4  * @version 1.1.0
 5  */
 6 /*
 7 Plugin Name: RCP Autz
 8 Plugin URI: http://wordpress.org/#
 9 Description: This plugins do stuff!
10 Author: Gregoire Lejeune
11 Version: 1.1.0
12 Author URI: http://algorithmique.net
13 */
14 
15 function xml_rcp_autz($args) {
16   $user = null;
17   
18   if(is_array($args)) {
19     $username = (string)$args[0];
20     $password = (string)$args[1];
21     $user = wp_authenticate($username, $password);
22   } else {
23     $user = get_userdata((int)$args);
24     if($user->ID == 0) {
25       $user = new WP_Error('unknow_user', __("ERROR: User unknown"));
26     }
27   }
28   
29   if(is_wp_error($user)) {
30     return false;
31   }
32   
33   return (int)$user->ID;
34 }
35 
36 function xml_rcp_autz_method( $methods ) {
37     $methods['gl.autz'] = 'xml_rcp_autz';
38     return $methods;
39 }
40 
41 add_filter( 'xmlrpc_methods', 'xml_rcp_autz_method' );
42 ?>

Une fois le plugin installé, nous pouvons faire un test. Pour cela il suffit de faire un appel RPC sur la méthode gl.autz en lui passant en paramètre un login et un mot de passe ou un ID. Voici un petit exemple avec Ruby :

 1 require "xmlrpc/client"
 2 
 3 server = XMLRPC::Client.new( "localhost", "/wordpress/xmlrpc.php" )
 4 result = server.call("gl.autz", "monlogin", "monmotdepasse")
 5 # ou
 6 # result = server.call("gl.autz", 123)
 7 
 8 if result == false
 9   puts "Wrong login/password or ID!"
10 else
11   puts "Welcome, wordpress user ##{result}"
12 end

Bien entendu, il faudra faire attention de sécuriser tout cela. En effet, il est facile de passer en force en créant à la main un cookie qui ferait croire qu'une session existe déjà. Ce problème se résout en plaçant dans le cookie de session l'ID utilisateur chiffré. Il sera ensuite décrypté avant de l'envoyer à l'API Wordpress (si possible par un canal chiffré, tant qu'à faire ;)). Voici un extrait de ce que j'utilise pour cela :

 1 require 'rubygems'
 2 require 'openssl'
 3 require 'digest/sha1'
 4 require 'uuid'
 5 
 6 class Protect
 7   def initialize(secret)
 8     @cipher = OpenSSL::Cipher::Cipher.new("aes-256-cbc")
 9     @key = Digest::SHA1.hexdigest(secret)
10   end
11 
12   def encrypt(data)
13     @cipher.encrypt
14     @cipher.key = @key
15     e = @cipher.update(data)
16     e << @cipher.final
17     return e
18   end
19 
20   def decrypt(data)
21     @cipher.decrypt
22     @cipher.key = @key
23     d = @cipher.update(data)
24     d << @cipher.final
25     return d
26   end
27 end
28 
29 secret = "Mon mot de passe hyper secret que personne ne doit jamais connaitre"
30 p = Protect.new(secret)
31 c = p.encrypt("Mon message hyper secret")
32 puts "Illisible : #{c}"
33 
34 # ...
35 
36 puts "Lisible : #{p.decrypt(c)}"

1 ;)
2 Bien que l'idée ait été abandonnée dans le cadre de mon taf, je propose quand même des patchs pour WP-RESTful qui est un excellent plugin.

Copyright © 2009 - 2011 Grégoire Lejeune.
All documents licensed under the Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License, except ones with specified licence.
Powered by Jekyll.