Retour : Page Principale > sommaire aide > sommaire aide-mémos

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:auth
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) :

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"
}
ou
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 :

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).