Serveur OpenId Masquerade sur ruby on rails

Préliminaires

La but de cet article n'est pas de décrire le fonctionnement d'OpenId, ni même d'expliquer son utilité pour l'authentification.
Pour cela, je vous invite à lire la présentation et l'article de Stéphane Bortzmeyer présentés aux JRES 2007 à Strasbourg. Ces documents sont attachés à cet article.

Nous allons faire au plus simple et utiliser une implémentation toute prête, non seulement du côté du langage, mais aussi qui fournira la couche web, quitte ensuite (un jour) à la modifier pour changer la façon d'authentifier si besoin : CAS au lieu d'une base locale ou accès LDAP, par exemple.
Faire simple, ça exclut, à mon sens, toutes les usines et framework Java. Reste donc à regarder ce qui se fait ailleurs : PHP, Python, Ruby, etc.
N'ayant pas encore eu l'occasion de me pencher sur les couches web pour Python qui semble pourtant bien fourni en implémentations OpenID, je n'ai creusé que PHP et Ruby. Chez PHP, il existe des déploiements stand-alone très simples, mais la plupart sont mono-utilisateur. J'ai donc opté pour l'implémentation Rails développée par un jeune Allemand, Dennis Blöte : Masquerade. Cette implémentation est plutôt riche car elle autorise l'authentification par Yubikey, la gestion de plusieurs profils par identité, est multi-utilisateurs stockés dans sa propre base et est particulièrement simple à mettre en oeuvre.

Installation

On se place sur une machine où une plateforme Rails est déployée avec mysql (exemple sur Debian).
Masquerade a besoin au préalable de trois gemmes :
sudo gem install ruby-openid ruby-yadis mocha
On récupère sur github la version en cours de Masquerade.

C'est parti, on détare et on entre dedans (le nom peut être différent selon le download de github):

tar xvzf masquerade.tar.gz
cd masquerade
On prépare les fichiers de config :
cd config
cp app_config.yml.example app_config.yml
cp database.yml.example database.yml
dans le fichier yaml de configuration de l'appli, il faut a minima compléter/modifier ceci
nano app_config.yml
host : openid.univ.run <= important : c'est le nom qu'on retrouvera dans l'URL de l'identifiant
...
time_zone : Muscat <= pour l'heure de La Réunion
...
mailer:
address: smtp.univ-reunion.fr
domain: univ-reunion.fr
from: openid@univ-reunion.fr
yubico:
id: 99 <= Attention : réindentez correctement cette ligne qui n'est pas bonne dans la conf downloadée sous peine d'erreur de syntaxe à l'install
api_key: youryubicoapikey

...
Et il n'y a plus qu'à installer :
rake gems:install
Et c'est fini ? presque ... Il reste à lui créer une base de données mysql.
Pour l'instant, on reste dans le contexte de développement, donc ce sera une base nommée masquerade_development avec un user masquerade sans mot de passe. On blindera ultérieurement sur le contexte de production.
mysql -u root -p
mysql> create database masquerade_development;
mysql> create user "masquerade"@"localhost";
mysql> grant all on masquerade_development.* to masquerade@localhost;
mysql> quit;
Tout est pret pour initialiser la base. Si la socket mysql n'est pas dans /tmp/mysql.sock, il faut soit ajouter la ligne
socket: /path/to/socket.sock
dans database.yml, soit créer un lien symbolique dans /tmp (mais tout ça, ce sont des problèmes d'installation de Rails normalement déjà résolus par ailleurs). Par exemple :
ln -s /var/run/mysqld/mysqld.sock /tmp/mysql.sock
Dès qu'on est sûr de pointer sur la socket, on lance l'initialisation de la base :
rake db:migrate
Et voilà, c'est fini pour une installation en test. On lance l'appli sur son serveur embarqué (webrick ou mongrel ou autre selon le déploiement de Rails)
cd ..
ruby script/server


ou autre façon de lancer avec mongrel si user:group == www-data:www-data en daemonisé :
sudo mongrel_rails start --user www-data --group www-data -d

Il n'y a plus qu'à tester sur http://rails.univ.run:3000/
Comments