Makina Blog
Makina Corpus publie sa propre librairie d’authentification OpenID Connect pour Django
Sur nos projets clients, nous travaillons régulièrement avec des technologies d’authentification permettant de déléguer la gestion d’identité à un logiciel pris sur étagère dont c’est le métier (par exemple : Keycloak).
La centralisation de la gestion de l’authentification permet d’améliorer l’expérience utilisateur : une fois la session ouverte, celle-ci peut servir à authentifier la personne auprès de plusieurs services. On parle de Single Sign On.
Derrière ces technologies permettant de faire du Single Sign On, on retrouve le protocole OpenID Connect
.
À nos yeux, l’écosystème Django ne propose pas d’implémentation mature, sûre et performante de ce protocole. Bien qu’il existe déjà des librairies qui implémentent le support d’OIDC au sein du système d’authentification Django, nous considérons que la plupart sont basées sur des primitives cryptographiques (les librairies Python implémentant la vérification de signatures RSA par exemple) qui ne sont ni sûres ni auditées. Les travaux à réaliser pour robustifier ces librairies seraient donc conséquents.
D’autres librairies ont un périmètre fonctionnel volontairement limité (notamment mozilla-django-oidc
), or nous souhaitons supporter des cas d’usage avancés du protocole (back-channel logout, multi-provider, support du mode API, etc.).
C’est pourquoi nous avons décidé d’implémenter notre propre librairie d’authentification des utilisateurs avec OpenID Connect, en logiciel libre 🎉 : ➡️ django-pyoidc ⬅️. Cette librairie s’appuie sur pyoidc pour l’implémentation des couches basses du protocole. Il s’agit donc de faciliter l’intégration de cette librairie dans Django (comme le fait par exemple Flask-pyoidc pour Flask).
Comme nos clients ont des besoins avancés, la librairie supporte des cas avancés du protocole OIDC : gestion de plusieurs fournisseurs d’identités, gestion du backchannel logout et support du mode API (DRF).
Gestion de plusieurs fournisseurs d’identités
Vous pouvez permettre aux personnes de se connecter avec des comptes OIDC venant de plusieurs fournisseurs d’identité : Google, FranceConnect, un Keycloak auto-hébergé, etc.
Gestion du backchannel logout
Lorsqu’une personne se déconnecte du SSO, celui-ci doit tuer toutes les sessions ouvertes sur les sites applicatifs. La plupart du temps, les librairies et applicatifs implémentent correctement le logout OIDC (se déconnecter localement mais aussi penser à signaler au SSO qu’on se déconnecte).
Le problème qui est souvent ignoré, c’est que l’utilisateur peut aussi se déconnecter depuis une autre application du SSO, et terminer sa session de SSO.
Le SSO doit alors signaler à l’ensemble des applications clientes (dont la nôtre) que la session est terminée.
Pour cela, le SSO a deux moyens :
- Soit le navigateur du client visite des URLs de logout de chaque application, c’est le front-channel logout (souvent à travers une iframe cachée dans la page de déconnexion du SSO).
- Soit, et en termes d’UX ** on préfère plutôt cette méthode**, le back-channel logout puisque c’est le SSO qui s’occupe de notifier les applications de la fermeture de la session avec des requêtes POST (et donc ce n’est pas le navigateur qui se déconnecte mais bien le SSO qui émet des demandes de déconnexion).
À notre connaissance, ce cas d’usage n’est supporté par aucune librairie existante. Notez que si vous ne gérez ni le frontchannel logout, ni le backchannel logout, vous pouvez à minima implémenter des vérifications régulières pour s’assurer que la session de SSO est toujours valide, pour ne pas garder une session applicative de 8 heures alors que la session de SSO est en fait terminée (mais là encore il n’est pas rare que cet aspect soit oublié).
Supporter le back-channel logout suppose que vous êtes capables de détruire des sessions de Django à partir des identifiants OIDC de ces sessions, il faut donc avoir prévu la chose lors de la création des sessions Django (enregistrer les identifiants de session SSO pour pouvoir les retrouver et les détruire).
Gestion du mode API
Lorsque l’on souhaite mettre en place de l’authentification sur une API gérée par django-rest-framework
, le fonctionnement n’a rien à voir avec l’authentification classique de Django. Par exemple, on ne souhaite pas rediriger les utilisateurs non connectés vers le login mais plutôt leur renvoyer une réponse HTTP 401.
L’application Django ne s’occupe pas d’ouvrir la session. C’est au client (un front JavaScript, du curl, etc.) d’ouvrir la session et d’envoyer les jetons d’accès au Django. Par conséquent, on retrouve deux clients OIDC : celui qui manipule les credentials utilisateur pour ouvrir une session, et celui dans Django qui sert à vérifier les jetons.
En conclusion
Bref, quand on commence à utiliser OIDC, on trouve très souvent des programmes 'Hello World’ qui permettent de passer les premières étapes (réussir à authentifier l’utilisateur sur notre application). Mais nous pensons qu’il est préférable d’utiliser dès le départ une librairie qui vous permettra de dépasser cette première étape et de gérer dans le futur tous ces aspects que vous ne découvrirez que plus tard. Attendez-vous à ce que nous publions prochainement plusieurs articles qui vous permettront de dépasser le Hello World et de mieux comprendre OIDC.
Nous avons mis beaucoup de soin dans cet outil, et aujourd’hui nous sommes heureux de le partager avec la communauté !
Si vous trouvez des bugs, n’hésitez pas à ouvrir un ticket sur le repo GitHub.
Formations associées
Formations Django
Formation Django avancé
À distance (FOAD) Du 17 au 21 mars 2025
Voir la Formation Django avancéFormations Django
Formation Django REST Framework
À distance (FOAD) Du 9 au 13 juin 2025
Voir la Formation Django REST FrameworkFormations Django
Formation Django initiation
Nantes Du 11 au 13 mars 2025
Voir la Formation Django initiationActualités en lien
DbToolsBundle : sortie de la version 2
Symfony
18/03/2025

SSO Keycloak : Ajouter un contrôle d'accès au niveau des flux d'authentification
DevOps
21/06/2022
Découvrez ici comment ajouter un contrôle d'accès grâce au SSO Keycloak

Administrer des comptes Keycloak depuis une application Python/Django
Django
18/11/2021
Dans cet article, nous allons créer une application Python/Django qui agira en tant que maître sur Keycloak afin de pouvoir ajouter facilement des comportements personnalisés à Keycloak.
