Nos copains d’IndieHosters proposent à leurs utilisateurs un catalogue de services étoffé. Leur métier est de gérer toute l’infrastructure autour de ces services, et un des enjeux importants du métier est la gestion des utilisateurs.
Lorsqu’un nouveau compte utilisateur est créé auprès d’un serveur d’identité, généralement le jeton d'accès que l’utilisateur transmet aux services contient les informations nécessaires à la création du compte utilisateur auprès de ces services. Prenons un exemple avec le serveur d’identité Keycloak et le service d’hébergement de fichiers Nextcloud :
- je crée mon compte utilisateur auprès de Keycloak (par exemple, en remplissant un formulaire d’inscription),
- je tente d’accéder à Nextcloud, mais je n’ai pas de session ouverte, je suis donc redirigé vers Keycloak,
- je m’identifie, Keycloak génère un jeton contenant mes informations personnelles,
- ce jeton est transmis à Nextcloud,
- Nextcloud lit mes informations personnelles dans le jeton. Si mon compte utilisateur n’existait pas sur Nextcloud, alors il est créé. Sinon, mes informations personnelles sont mises à jour dans Nextcloud.
- Nextcloud m’autorise enfin l’accès aux fichiers.
C’est très pratique, mais ça ne couvre pas tous les cas de figure :
- Comment faire pour partager un document avec un utilisateur qui ne s’est jamais encore connecté à un service ? Pour le moment il est nécessaire d’attendre la première connexion d’un utilisateur avant que son compte ne soit créé sur Nextcloud.
- Un utilisateur édite une information le concernant sur le serveur d’identité, par exemple son nom d’affichage. Comment faire pour diffuser l'information instantanément auprès des services (par exemple un compte mail ou un chat qui identifie l'utilisateur par ce même Keycloak) ?Actuellement, les mises à jour d’informations personnelles ne sont répandues sur Nextcloud que lorsque les utilisateurs s’y connectent.
- Comment supprimer ou désactiver un compte utilisateur auprès de tous les services ?
Pour effectuer toutes ces opérations, on utilise un protocole de provisionnement. Provisionner consiste grossièrement à diffuser des modification sur un objet entre plusieurs services. De nos jours, le protocole de provisionnement souvent utilisé dans l’industrie est SCIM. IndieHosters a préparé une page web d’explications sur le protocole que l’on vous invite à consulter.
IndieHosters a obtenu un financement auprès de NLNet pour développer SCIM dans l’écosystème des outils qu’ils utilisent, et ont fait appel à Yaal Coop pour une partie des travaux. Nous avions plusieurs mission :
- Fournir un outil en ligne de commandes qui permette de communiquer avec un serveur SCIM, et de tester la conformité d’un serveur SCIM vis-à-vis de la norme.
Ce projet a donné lieu à plusieurs sous-projets:
- scim2-models, une bibliothèque Python de sérialisation et validation de ressources SCIM. Elle est basée sur Pydantic et fournit des objets natifs qui représentent des ressources SCIM et qui implémente une partie de la norme. Elle a pour but de servir de brique de base à des serveurs ou des clients SCIM.
- scim2-client, une bibliothèque Python de fabrication et d’analyse pythonique de requêtes SCIM. Elle s’appuie sur scim2-models et sur httpx pour créer des requêtes SCIM, et analyser les réponses des serveurs.
- scim2-server, un prototype de serveur SCIM développé par CONTACT Software utilisant scim2-models, et co-maintenu par Yaal Coop.
- scim2-tester, une bibliothèque Python de test de conformité aux normes SCIM. Elle s’appuie sur scim2-client pour envoyer diverses requêtes à un serveur SCIM et observer son comportement en réponse.
- scim2-cli, un outil en ligne de commandes qui s’appuie sur scim2-client et scim2-tester et qui fournit une interface pour effectuer des opérations simples sur un serveur SCIM.
- Proposer l’adoption de SCIM comme protocole officiel de provisionnement dans le protocole de messagerie instantanée Matrix. Nous avons rédigé une proposition d’évolution de la norme (MSC4098), pour lesquelles les discussions sont en cours. À l’heure actuelle la proposition est toujours à l’étude, mais le principal argument contre est que le provisionnement est hors du périmètre fonctionnel que cherche à couvrir Matrix.
- Conjointement à la proposition d’évolution de la norme, nous avons proposé une implémentation de SCIM dans synapse, le serveur Matrix le plus utilisé actuellement. L’implémentation se base sur scim2-models.
SCIM nous apparaît comme une norme d'avenir pour le provisionnement et espérons que les bibliothèques que nous avons construites aideront son développement, grâce à de nouveaux outils Python et, à terme, sans ce limiter à ce langage. Le provisionnement de services est une technique utile aux petit fournisseurs se services en ligne, comme ceux du collectif CHATONS. Ils font généralement fonctionner ensemble des services hétérogènes, et des normes telles que SCIM aident ces services à communiquer entre eux. Nous espérons qu'à terme nos travaux permettront d'avoir un impact sur la qualité de service de ces petits fournisseurs, et ainsi aider leur développement.