Retour : Page Principale > sommaire aide > sommaire aide-mémos
Comment faire pour intĂ©grer le SSO Ă votre nouvelle application ? Y a-t-il du code tout prĂȘt ? Des bonnes pratiques Ă connaĂźtre ? T'habites Bourg-la-Reine ou t'habites Choisy-le-Roi ? Plein de questions qu'il faut se poser pour authentifier correctement ses utilisateurs chĂ©ris.
Celui-ci gÚre la connexion et la déconnexion, et peut vous rediriger vers la page depuis laquelle vous l'avez appelé.
Typiquement, si on se trouve sur la page http://www.tela-botanica.org/maSuperAppli?tralala=pouet :
On trouve un exemple de cela dans le code de la barre de navigation (séparé entre le template PHP et le code JS) :
En lisant ce cookie, on obtient le dernier jeton valide reçu par l'utilisateur. Ce jeton est généralement expiré (15mn de durée de vie); en appelant le service auth:rafraichir de l'annuaire avec le jeton expiré passé en GET ou dans le header Authorization, on reçoit en retour un jeton rafraßchi, et on a gagné.
Principe:
Afin d'allĂ©ger le serveur, un cookie mandataire est posĂ© pour chaque application, d'une durĂ©e courte (30s par exemple); ceci permet de ne faire des triples-redirections que toutes les 30 secondes. En outre sur Papyrus, ce cookie est prolongĂ© de 30s tant que l'utilisateur change de page; on considĂšre que le basculement vers une autre application depuis laquelle il se dĂ©connecte, puis le retour sur la page d'origine prend plus de 30 secondes, et n'empĂȘche pas de dĂ©tecter la dĂ©connexion (stratĂ©gie Ă vĂ©rifier sur le long terme).
NOTE importante : pour les URL Ă©tant dĂ©jĂ des redirections (ex: http://www.tela-botanica.org/bdtfx-nn-141-synthese ), il est important que ces redirections conservent la Query String sans quoi le paramĂštre GET Authorization renvoyĂ© par l'annuaire sera ignorĂ© et la redirection bouclera et n'aboutira jamais ! Penser Ă mettre le flag [QSA] dans le .htaccess oĂč la redirection est dĂ©clarĂ©e.
Tout service qui souhaite connaĂźtre les informations de l'utilisateur loggĂ© sur le SSO devrait fonctionner Ă base de jetons. Les services Ă©tant gĂ©nĂ©ralement sur un domaine diffĂ©rent de www.tela-botanica.org (api. par exemple, ou autre), ils ne peuvent pas se reposer sur le cookie tb_auth. Ils doivent donc ĂȘtre capables de lire un jeton que le client qui les appelle inclura dans ses requĂȘtes.
Ce jeton peut ĂȘtre passĂ© en POST (avec GET, attention Ă la longueur) mais l'idĂ©al est d'utiliser l'entĂȘte Authorization.
Le client devrait appeler le service en ajoutant un entĂȘte HTTP de la forme (avec ici un exemple de jeton) :
Le service doit donc dĂ©coder cet entĂȘte pour rĂ©cupĂ©rer le jeton.
ATTENTION: il est important de valider le jeton auprÚs de l'annuaire, pour vérifier qu'il est authentique, et éviter l'usurpation d'identité.
Utilisation :
Bon avec ça il y aura éventuellement des problÚmes d'avertissements sur la stabilité, alors le mieux est de demander une version précise dans composer.json. Exemple :
ou
puis une fois le fichier mis Ă jour :
Et voili !
Exemples d'utilisation de ce composant :
Sinon, un exemple moins propre de décodage / vérification de jeton en PHP sans ce composant se trouve dans GestionUtilisateur.php de la bibliothÚque de services DeL (fonction getUtilisateurIdentifie() et celles qu'elle appelle).
Intégration du SSO avec le widget d'authentification
Comment faire pour intĂ©grer le SSO Ă votre nouvelle application ? Y a-t-il du code tout prĂȘt ? Des bonnes pratiques Ă connaĂźtre ? T'habites Bourg-la-Reine ou t'habites Choisy-le-Roi ? Plein de questions qu'il faut se poser pour authentifier correctement ses utilisateurs chĂ©ris.
Principe de l'authentification
Les Ă©tapes sont les suivantes (voir la doc du service annuaire:auth) :- on appelle service:annuaire:auth/identite pour savoir si on est connu ou non
- si oui, obtention d'un jeton JWT :
- on décode ce jeton pour avoir les infos de l'utilisateur (courriel, nom / pseudo, id...)
- si la couche métier est distincte (webservices) :
- on stocke le jeton quelque part pour lui passer
- la couche de webservices doit Ă chaque appel :
- récupérer le jeton
- le vérifier auprÚs de l'annuaire en appelant service:annuaire:auth/verifierjeton
- le décoder
- une fois les infos utilisateur obtenues, vérifier que l'utilisateur en cours a le droit d'exécuter l'action du service
- sinon :
- on se débrouille avec l'id / courriel utilisateur qu'on vient de décoder
- si non, pas de jeton :
- on se connecte en appelant service:annuaire:auth/connexion et on refait un tour
- à la fin, on se déconnecte en appelant service:annuaire:auth/deconnexion
Intégration dans l'interface (applications AJAX)
Le plus simple est d'utiliser le widget d'authentification : http://www.tela-botanica.org/widget:reseau:authCelui-ci gÚre la connexion et la déconnexion, et peut vous rediriger vers la page depuis laquelle vous l'avez appelé.
Typiquement, si on se trouve sur la page http://www.tela-botanica.org/maSuperAppli?tralala=pouet :
- on appelle service:annuaire:auth/identite pour savoir si on est connu ou non (avec un appel AJAX $.get() par exemple - attention il faut ajouter xhrFields: withCredentials, voir le fichier .js d'exemple)
- si oui, obtention d'un jeton :
- on Ă©crit "bonjour $intitule"
- on propose un lien de déconnexion de la forme : http://www.tela-botanica.org/widget:reseau:auth?action=deconnexion&origine=http://www.tela-botanica.org/maSuperAppli?tralala=pouet
- si non, pas de jeton :
- on propose un lien de connexion de la forme : http://www.tela-botanica.org/widget:reseau:auth?origine=http://www.tela-botanica.org/maSuperAppli?tralala=pouet
On trouve un exemple de cela dans le code de la barre de navigation (séparé entre le template PHP et le code JS) :
Composant javascript réutilisable (Bower)
à compléter - penser à déclarer un composant dans Bower (2016-03-10)Intégration dans l'interface (applications non-AJAX)
L'intĂ©gration au SSO est facile avec les applications AJAX : elles ont le droit d'appeler l'annuaire tout en bĂ©nĂ©ficiant des cookies du navigateur. Mais pour les applications classiques sans AJAX, c'est une autre paire de manches. Le problĂšme est le suivant : une application qui se trouve sur un domaine diffĂ©rent du domaine du cookie tb_auth (www.tela-botanica.org) ou qui n'est pas en HTTPS sur ce domaine, ne pourra pas disposer du cookie. Appeler l'annuaire en PHP avec un file_get_contents() ou libcurl ne sert Ă rien puisqu'on n'a pas le cookie. Il est donc impossible pour ces applications de savoir si l'utilisateur est connectĂ© au SSO ou non. On est bien embĂȘtĂ©s, dites-moi.Solution 1 - employĂ©e par le plugin wp-tb-sso
Les applications installĂ©es sur un domaine *.tela-botanica.org et fonctionnant sur HTTPS bĂ©nĂ©ficient du cookie tb_auth, sĂ©curisĂ© mais disponible sur tous les sous-domaines (fait le 2016-03-01). Ă partir de fin 2016, cela commence Ă ĂȘtre le cas pour toutes les applications.En lisant ce cookie, on obtient le dernier jeton valide reçu par l'utilisateur. Ce jeton est gĂ©nĂ©ralement expirĂ© (15mn de durĂ©e de vie); en appelant le service auth:rafraichir de l'annuaire avec le jeton expirĂ© passĂ© en GET ou dans le header Authorization, on reçoit en retour un jeton rafraĂźchi, et on a gagnĂ©.
Solution 2 - employée par Yeswiki et Papyrus
Faire des triples redirections de ouf tout en n'obtenant qu'une synchronisation partielle. C'est un peu ça ou rien...Principe:
- rediriger vers l'annuaire pour demander le statut (connecté ou non) - celui-ci sait lire le cookie tb_auth s'il est présent (redirection 1)
- connecté ou non, l'annuaire redirige vers la page d'origine avec un paramÚtre GET Authorization contenant un jeton SSO, ou une chaßne vide (redirection 2)
- la page d'origine pose un cookie mandataire (voir ci-dessous) de courte durée, contenant le jeton, ou un mot-clef signifiant l'absence de jeton (un cookie nul ne peut pas exister), et prend acte du caractÚre connecté ou non de l'utilisateur
- afin d'Ă©liminer le paramĂštre Authorization de l'URL, qui perturbe les copier-coller etc., la page d'origine se redirige vers elle-mĂȘme en supprimant ce paramĂštre, et la prĂ©sence du cookie mandataire empĂȘche de rediriger en boucle (redirection 3)
- ouf !
Afin d'allĂ©ger le serveur, un cookie mandataire est posĂ© pour chaque application, d'une durĂ©e courte (30s par exemple); ceci permet de ne faire des triples-redirections que toutes les 30 secondes. En outre sur Papyrus, ce cookie est prolongĂ© de 30s tant que l'utilisateur change de page; on considĂšre que le basculement vers une autre application depuis laquelle il se dĂ©connecte, puis le retour sur la page d'origine prend plus de 30 secondes, et n'empĂȘche pas de dĂ©tecter la dĂ©connexion (stratĂ©gie Ă vĂ©rifier sur le long terme).
NOTE importante : pour les URL Ă©tant dĂ©jĂ des redirections (ex: http://www.tela-botanica.org/bdtfx-nn-141-synthese ), il est important que ces redirections conservent la Query String sans quoi le paramĂštre GET Authorization renvoyĂ© par l'annuaire sera ignorĂ© et la redirection bouclera et n'aboutira jamais ! Penser Ă mettre le flag [QSA] dans le .htaccess oĂč la redirection est dĂ©clarĂ©e.
Intégration dans les services / couches métier (protection des accÚs)
Important : en aucun cas un programme autre que le Site Web tela-botanica.org ne doit lire directement la base de donnĂ©es des comptes utilisateurs ! Bah oui c'est à ça que sert l'annuaire : tout est dĂ©couplĂ©. Les applications qui doivent conserver des informations sur les utilisateurs (ex: CeL, DeL...) dans une table de leur base de donnĂ©es, doivent gĂ©rer elles-mĂȘmes la synchronisation avec l'annuaire.Tout service qui souhaite connaĂźtre les informations de l'utilisateur loggĂ© sur le SSO devrait fonctionner Ă base de jetons. Les services Ă©tant gĂ©nĂ©ralement sur un domaine diffĂ©rent de www.tela-botanica.org (api. par exemple, ou autre), ils ne peuvent pas se reposer sur le cookie tb_auth. Ils doivent donc ĂȘtre capables de lire un jeton que le client qui les appelle inclura dans ses requĂȘtes.
Ce jeton peut ĂȘtre passĂ© en POST (avec GET, attention Ă la longueur) mais l'idĂ©al est d'utiliser l'entĂȘte Authorization.
Le client devrait appeler le service en ajoutant un entĂȘte HTTP de la forme (avec ici un exemple de jeton) :
Authorization: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczpcL1wvd3d3LnRlbGEtYm90YW5pY2Eub3JnIiwidG9rZW5faWQiOiJ0Yl9hdXRoIiwic3ViIjoibWF0aGlhc0B0ZWxhLWJvdGFuaWNhLm9yZyIsImlhdCI6MTQzOTIwMDgzNSwiZXhwIjoxNDM5ODkwNzg1LCJzY29wZXMiOlsidGVsYS1ib3RhbmljYS5vcmciXSwiaWQiOiIyNDYwNCIsInByZW5vbSI6Ik1hdGhpYXMiLCJub20iOiJDSE9VRVQiLCJwc2V1ZG8iOiIiLCJwc2V1ZG9VdGlsaXNlIjpmYWxzZSwiaW50aXR1bGUiOiJNYXRoaWFzIENIT1VFVCIsIm5vbVdpa2kiOiJNYXRoaWFzQ2hvdWV0IiwiZGF0ZURlcm5pZXJlTW9kaWYiOjE0MzE5OTM4NzF9.0dxwv4MQFu_g8VKEZpY8MAEZkCA6gAat5Z-mCCMx12w
Le service doit donc dĂ©coder cet entĂȘte pour rĂ©cupĂ©rer le jeton.
ATTENTION: il est important de valider le jeton auprÚs de l'annuaire, pour vérifier qu'il est authentique, et éviter l'usurpation d'identité.
Permissions (rĂŽles) et groupes
à compter de la version 2 reposant sur Wordpress, les jetons émis par l'annuaire contiennent deux collections supplémentaires :- permissions une liste des noms de rÎles endossés par l'utilisateur
- avec l'implémentation reposant sur Wordpress, les permissions correspondent aux rÎles Wordpress réglables dans l'interface de modification d'un utilisateur
- le plugin Wordpress Tela Botanica ajoute des permissions commençant par tb_; ces permissions sont destinĂ©es Ă ĂȘtre interprĂ©tĂ©es par les applications en utilisant par exemple le composant tb-auth-php et permettent Ă l'administrateur du site Web de donner facilement des pouvoirs aux utilisateurs sur une application
- groupes : un dictionnaire ayant pour clé les identifiants des groupes auxquels l'utilisateur appartient, et pour valeur le rÎle de l'utilisateur dans ce groupe (ex: "adm" pour "administrateur")
- avec l'implémentation reposant sur Wordpress, les groupes correspondent aux "projets" de l'espace projets, c'est à dire aux groupes Buddypress
Composant PHP réutilisable (Composer)
Une classe toute prĂȘte existe pour PHP; elle est disponible avec composer (dĂ©clarĂ©e sur packagist.org).Utilisation :
composer require telabotanica/tb-auth-php
Bon avec ça il y aura éventuellement des problÚmes d'avertissements sur la stabilité, alors le mieux est de demander une version précise dans composer.json. Exemple :
"require": { "telabotanica/tb-auth-php": "0.1.8@dev" }
composer require telabotanica/tb-auth-php:0.1.8@dev
puis une fois le fichier mis Ă jour :
composer update
Et voili !
Exemples d'utilisation de ce composant :
- principe sommaire dans le README
- exemple d'agrégation du composant dans la classe de gestion de droits d'ezmlm-php
Sinon, un exemple moins propre de décodage / vérification de jeton en PHP sans ce composant se trouve dans GestionUtilisateur.php de la bibliothÚque de services DeL (fonction getUtilisateurIdentifie() et celles qu'elle appelle).