Utilisation des Web Services (modules SOAP)
- Pré-requis
- Web Service pour l'authentification
- Web Service pour l'accès aux sessions
- Web Service pour l'accès à la configuration
- Sécurisation des Web Services
Pré-requis
Le module Perl SOAP::Lite doit être installé sur le système.- Pour un environnement Debian :
# apt-get install libsoap-lite-perl
- Pour un environnement Red Hat :
# yum install perl-SOAP-Lite
Web Service pour l'authentification
À partie de la version 0.9.3, les fonctionnalités SOAP sont incluse dans le portail. Il suffit de les activer avec l'option "Soap => 1".
Le portail est alors capable de répondre aux sollicitations web classiques et aux requêtes SOAP. Il propose 2 fonctions SOAP:
- getCookies(user,password) : retourne le ou les cookies générés par le portail et un code d'erreur (0 si tout va bien)
- error(language,code) : retourne le texte correspondant à l'erreur
#!/usr/bin/perl -l use SOAP::Lite; use Data::Dumper;
my $soap = SOAP::Lite->proxy('http://auth.example.com/') ->uri('urn:/Lemonldap/NG/Portal/SharedConf');
my $r = $soap->getCookies( 'user', 'password' );
# Catch SOAP errors if ( $r->fault ) { print STDERR "SOAP Error: " . $r->fault->{faultstring}; } else { my $res = $r->result();
# If authentication failed, display error if ( $res->{error} ) { print STDERR "Error: " . $soap->error( 'fr', $res->{error} )->result(); }
# print session-ID else { print "Cookie: lemonldap=" . $res->{cookies}->{lemonldap}; } }
Web Service pour l'accès aux sessions
Présentation
Ce Web Service permet au portail (Lemonldap::NG::Portal) et au handler (Lemonldap::NG::Handler) d'accéder en lecture et en écriture aux sessions WebSSO. Cela permet par exemple à un handler d'aller récupérer les sessions à distance avec une simple requête SOAP (sur HTTP). Pour des architectures plus complexes, cela permet également de disposer de plusieurs portails qui enregistrent les sessions à distance.
Installation du script serveur SOAP
Au niveau du serveur principal, c'est-à-dire celui qui stocke les sessions, le script suivant doit être installé, par exemple dans /var/www/lemonldapng/soap/sessions.pl :#! /usr/bin/perl
use Lemonldap::NG::Manager::SOAPServer;
Lemonldap::NG::Manager::SOAPServer->start ( realSessionStorage => "Apache::Session::File", realSessionStorageOptions => { Directory => "/tmp", }, type => "sessions", AuthorizedFunctions => "new get set delete", );
- realSessionStorage : Module Apache::Session à utiliser
- realSessionStorageOptions : Options du module Apache::Session
- type : "sessions" ou "config"
- AuthorizedFunctions : Fonctions SOAP autorisées :
- new : créer une nouvelle session (et donc un nouveau session_id)
- get : lire une session
- set : écrire une session
- delete : supprimer une session
#! /usr/bin/perl
use Lemonldap::NG::Manager::SOAPServer;
Lemonldap::NG::Manager::SOAPServer->start ( realSessionStorage => "Apache::Session::MySQL", realSessionStorageOptions => { DataSource => "DBI:mysql:database=lemonldapng;host=127.0.0.1", UserName => "ssoadmin", Password => "ssopasswd", LockDataSource => "DBI:mysql:database=lemonldapng;host=127.0.0.1", LockUserName => "ssoadmin", LockPassword => "ssopasswd", }, type => "sessions", AuthorizedFunctions => "new get set delete", );
Configuration Apache
L'accès au script SOAP doit être autorisé par Apache, par exemple :Alias /soap /var/www/lemonldapng/soap
<Files ~ ".(pl)$"> SetHandler perl-script PerlHandler ModPerl::Registry PerlSendHeader On </Files>
<Directory /var/www/lemonldapng/soap> AllowOverride None Options +ExecCGI +FollowSymLinks -Indexes </Directory>
- HTTP-BASIC : un identifiant et un mot de passe doivent être fournis par le client SOAP
- SSL/TLS : un certificat client doit être fourni par le client SOAP
Configuration d'un handler
Le handler effectue une requête SOAP pour lire les informations de sessions, en fournissant l'identifiant de sessions retrouvé dans le cookie fourni par le navigateur de l'utilisateur. La configuration SOAP est effectué au niveau de la fonction init() du module, en surchargeant les paramètres de configuration globalStorage et globalStorageOptions :package Handler;
use strict ; use Lemonldap::NG::Handler::SharedConf qw(:all) ;
our $VERSION = '0.01' ; our @ISA = qw(Lemonldap::NG::Handler::SharedConf) ;
*EXPORT_TAGS = *Lemonldap::NG::Handler::SharedConf::EXPORT_TAGS ; *EXPORT_OK = *Lemonldap::NG::Handler::SharedConf::EXPORT_OK ; *EXPORT = *Lemonldap::NG::Handler::SharedConf::EXPORT ;
PACKAGE->init ({ globalStorage => "Lemonldap::NG::Manager::Apache::Session::SOAP", globalStorageOptions => { proxy => "http://websso.mydomain.com/soap/sessions.pl", proxyOptions => { timeout => "5", }, }, configStorage => { type => "DBI", dbiChain => "DBI:mysql:database=lemonldapng;host=127.0.0.1", dbiUser => "ssoadmin", dbiPassword => "ssopasswd", dbiTable => "lmConfig", },
localStorage => "Cache::FileCache", localStorageOptions => {}, https => "0", }) ;
1;
Configuration d'un portail
Pour le portail, on procède de la même manière :#!/usr/bin/perl
use Lemonldap::NG::Portal::SharedConf;
my $portal = Lemonldap::NG::Portal::SharedConf->new( globalStorage => "Lemonldap::NG::Manager::Apache::Session::SOAP", globalStorageOptions => { proxy => "http://websso.mydomain.com/soap/sessions.pl", proxyOptions => { timeout => "5", }, }, configStorage => { type => "DBI", dbiChain => "DBI:mysql:database=lemonldapng;host=127.0.0.1", dbiUser => "ssoadmin", dbiPassword => "ssopasswd", dbiTable => "lmConfig",}, ); ...
Configuration à travers le Manager
Il est possible d'éviter de surcharger les paramètres de configuration dans le portail et le handler en agissant directement sur la configuration des sessions au niveau du Manager. Pour cela, il suffit de se rendre dans la partie "Stockage des Sessions" puis de remplir correctement les paramètres :- Module Apache::Session : Lemonldap::NG::Manager::Apache::Session::SOAP
- Paramètres du module Apache::Session :
Web Service pour l'accès à la configuration
Présentation
Ce Web Service permet au portail (Lemonldap::NG::Portal), au manager (Lemonldap::NG::Manager) et au handler (Lemonldap::NG::Handler) d'accéder en lecture et en écriture à la configuration du WebSSO.Installation du script serveur SOAP
Au niveau du serveur principal, c'est-à-dire celui qui stocke les sessions, le script suivant doit être installé, par exemple dans /var/www/lemonldapng/soap/config.pl :#!/usr/bin/perl
use Lemonldap::NG::Manager::SOAPServer;
Lemonldap::NG::Manager::SOAPServer->start( configStorage => { type => 'DBI', dbiChain => "DBI:mysql:database=lemonldapng;host=127.0.0.1", dbiUser => "ssoadmin", dbiPassword => "ssopasswd", dbiTable => "lmConfig", } );
Configuration Apache
Elle est identique à celle des sessions, si les scripts sessions.pl et config.pl sont bien dans le même répertoire :
Alias /soap /var/www/lemonldapng/soap
<Files ~ ".(pl)$"> SetHandler perl-script PerlHandler ModPerl::Registry PerlSendHeader On </Files>
<Directory /var/www/lemonldapng/soap> AllowOverride None Options +ExecCGI +FollowSymLinks -Indexes </Directory>
Configuration d'un handler, d'un portail ou d'un manager
Pour tous ces éléments, il suffit de remplacer le paramètre configStorage :
… configStorage => { type => "SOAP", proxy => "http://websso.mydomain.com/soap/config.pl", }, ...
Sécurisation des Web Services
HTTP-BASIC
Si le serveur SOAP est protégé par une authentification BASIC, le client (par exemple un handler) doit être paramétré ainsi :package My::Package;
use base Lemonldap::NG::Handler::SharedConf;
PACKAGE->init ( { localStorage => "Cache::FileCache", localStorageOptions => { 'namespace' => 'MyNamespace', 'default_expires_in' => 600, }, configStorage => { type => 'SOAP', proxy => 'http://manager.example.com/soapserver.pl', User => 'http-user', Password => 'pass', }, https => 1, } );
SSL/TLS
Si le serveur SOAP requiert un certificat client, le client (par exemple un handler) doit être paramétré ainsi :package My::Package;
use base Lemonldap::NG::Handler::SharedConf;
$ENV{HTTPS_CERT_FILE} = 'client-cert.pem'; $ENV{HTTPS_KEY_FILE} = 'client-key.pem';
__PACKAGE__->init ( { localStorage => "Cache::FileCache", localStorageOptions => { 'namespace' => 'MyNamespace', 'default_expires_in' => 600, }, configStorage => { type => 'SOAP', proxy => 'http://manager.example.com/soapserver.pl', }, https => 1, } );