pismile

Intégrer pismile avec Django

Connexion OIDC avec mozilla-django-oidc, utilisateurs identifiés par leur sub plutôt que par e-mail.

1 min de lecture · Mis à jour le · API v1

Connectez-vous pour voir vos propres identifiants sandbox dans les exemples.

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.

  1. Installez la bibliothèque

    Terminal
    pip install mozilla-django-oidc
    python manage.py startapp accounts
  2. Configurez pismile

    settings.py
    import 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.py
    from django.urls import include, path
    from accounts import views
    
    urlpatterns = [
        path("oidc/", include("mozilla_django_oidc.urls")),
        path("", views.home, name="home"),
    ]
  3. Liez les utilisateurs à leur sub

    accounts/models.py
    from 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.py
    from 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 user
    Terminal
    python manage.py makemigrations accounts
    python manage.py migrate
  4. Affichez l'utilisateur

    accounts/views.py
    from 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.

  5. Testez

    Terminal
    PISMILE_CLIENT_SECRET=votre_secret python manage.py runserver

    Ouvrez http://localhost:8000, connectez-vous avec un alias de test du sandbox BCEAO et confirmez la demande dans le playground : un utilisateur pismile-… et son PismileProfile sont créés.

Cette page vous a-t-elle aidé ?