Intégrer pismile avec Django
Connexion OIDC avec mozilla-django-oidc, utilisateurs identifiés par leur sub plutôt que par e-mail.
Ce guide utilise mozilla-django-oidc. Par défaut, cette bibliothèque retrouve les utilisateurs par leur e-mail : comme pismile n'en transmet pas, on la configure pour utiliser le sub. Durée : 15 minutes.
Installez la bibliothèque
Terminalpip install mozilla-django-oidc python manage.py startapp accountsConfigurez pismile
settings.pyimport os INSTALLED_APPS += ["mozilla_django_oidc", "accounts"] AUTHENTICATION_BACKENDS = ["accounts.auth.PismileBackend"] OIDC_RP_CLIENT_ID = "VOTRE_CLIENT_ID" OIDC_RP_CLIENT_SECRET = os.environ["PISMILE_CLIENT_SECRET"] OIDC_RP_SCOPES = "openid profile" OIDC_RP_SIGN_ALGO = "RS256" OIDC_TOKEN_USE_BASIC_AUTH = True # secret envoyé en client_secret_basic OIDC_USE_PKCE = True OIDC_OP_AUTHORIZATION_ENDPOINT = "https://pismile.com/oauth2/authorize" OIDC_OP_TOKEN_ENDPOINT = "https://pismile.com/oauth2/token" OIDC_OP_USER_ENDPOINT = "https://pismile.com/userinfo" OIDC_OP_JWKS_ENDPOINT = "https://pismile.com/oauth2/jwks" LOGIN_REDIRECT_URL = "/" LOGOUT_REDIRECT_URL = "/"urls.pyfrom django.urls import include, path from accounts import views urlpatterns = [ path("oidc/", include("mozilla_django_oidc.urls")), path("", views.home, name="home"), ]Liez les utilisateurs à leur sub
accounts/models.pyfrom django.conf import settings from django.db import models class PismileProfile(models.Model): user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name="pismile_profile") sub = models.CharField(max_length=255, unique=True) country = models.CharField(max_length=2, blank=True) category = models.CharField(max_length=1, blank=True)accounts/auth.pyfrom mozilla_django_oidc.auth import OIDCAuthenticationBackend from .models import PismileProfile class PismileBackend(OIDCAuthenticationBackend): """Utilisateurs retrouvés par leur sub pismile (pismile ne transmet pas d'e-mail).""" def verify_claims(self, claims): return bool(claims.get("sub")) def filter_users_by_claims(self, claims): return self.UserModel.objects.filter(pismile_profile__sub=claims.get("sub")) def create_user(self, claims): user = self.UserModel.objects.create_user( username=f"pismile-{claims['sub']}"[:150], first_name=(claims.get("name") or "")[:150], ) PismileProfile.objects.create( user=user, sub=claims["sub"], country=claims.get("pismile_country", ""), category=claims.get("pismile_category", ""), ) return user def update_user(self, user, claims): user.first_name = (claims.get("name") or "")[:150] user.save(update_fields=["first_name"]) PismileProfile.objects.filter(user=user).update( country=claims.get("pismile_country", ""), category=claims.get("pismile_category", ""), ) return userTerminalpython manage.py makemigrations accounts python manage.py migrateAffichez l'utilisateur
accounts/views.pyfrom django.shortcuts import render def home(request): return render(request, "home.html")templates/home.html{% if user.is_authenticated %} <h1>Bonjour {{ user.first_name }}</h1> <p> Pays : {{ user.pismile_profile.country }} · Catégorie : {{ user.pismile_profile.category }} </p> <form action="{% url 'oidc_logout' %}" method="post"> {% csrf_token %}<button type="submit">Se déconnecter</button> </form> {% else %} <a href="{% url 'oidc_authentication_init' %}">Se connecter avec pismile</a> {% endif %}Ce gabarit utilise la syntaxe de Django :
{{ user.first_name }}est une variable Django, pas une variable de cette documentation.Testez
TerminalPISMILE_CLIENT_SECRET=votre_secret python manage.py runserverOuvrez
http://localhost:8000, connectez-vous avec un alias de test du sandbox BCEAO et confirmez la demande dans le playground : un utilisateurpismile-…et sonPismileProfilesont créés.
Cette page vous a-t-elle aidé ?
Merci, votre avis nous aide à améliorer la documentation.