Auth

Activer l’authentification

L’authentification consiste à récupérer l’utilisateur associé à une requête.
Pour récupérer l’utilisateur en BDD à partir de sa session:

Pour comprendre comment ça marche:


Backend d’authentification

Pour essayer de récupérer un utilisateur:

Pour comprendre comment ça marche:

  1. Lorsqu’on appelle cette fonction, Django va boucler sur la liste des “backends d’authentification” pour essayer de récupérer l’utilisateur.
    Il continue de boucler sur les backends suivants tant qu’il a pas récupéré un utilisateur ou une exception PermissionDenied.

     def authenticate(request=None, **credentials):
         """
         If the given credentials are valid, return a User object.
         """
         for backend, backend_path in _get_backends(return_tuples=True):
             backend_signature = inspect.signature(backend.authenticate)
             try:
                 backend_signature.bind(request, **credentials)
             except TypeError:
                 # This backend doesn't accept these credentials as arguments. Try the next one.
                 continue
             try:
                 user = backend.authenticate(request, **credentials)
             except PermissionDenied:
                 # This backend says to stop in our tracks - this user should not be allowed in at all.
                 break
             if user is None:
                 continue
             # Annotate the user object with the path of the backend.
             user.backend = backend_path
             return user
    
  2. Par défaut, le seul backend d’authentification activé est Model

     AUTHENTICATION_BACKENDS = [
         # username/password authentication
        'django.contrib.auth.backends.ModelBackend',  
     ]
    
  3. Le backend Model récupère le modèle User spécifié par AUTH_USER_MODEL
    Par défaut, il s’agit du modèle User de l’application django.contrib.auth

     AUTH_USER_MODEL = 'auth.User'
    
  4. Il effectue une recherche d’utilisateur à partir du nom d’utilisateur.
    Le champ à utiliser est spécifié par la propriété USERNAME_FIELD du modèle.
    Par défaut, il s’agit de username

     class AbstractUser(AbstractBaseUser, PermissionsMixin):
         USERNAME_FIELD = 'username'
    
  5. Une fois l’utilisateur récupéré, les mots de passe sont comparés — en appelant user.check_password(password).
    Si les mots de passe ne correspondent pas, alors le backend retourne None et Django continue sur le backend suivant s’il y en a.


Mise en session

Pour mettre un utilisateur en session:

Pour comprendre comment ça marche:

  1. Le middleware de session vérifie si request.session existe et est toujours valide dans la méthode process_response.

     def process_response(self, request, response):
         """
         If request.session was modified, or if the configuration is to save the
         session every time, save the changes and set a session cookie or delete
         the session cookie if the session has been emptied.
         """
         try:
             accessed = request.session.accessed
             modified = request.session.modified
             empty = request.session.is_empty()
         except AttributeError:
             return response
    
  2. Si la session a été modifiée, il la sauvegarde et met l’ID de session dans le cookie de session retourné à l’utilisateur.

     try:
         request.session.save()
     except UpdateError:
         raise SessionInterrupted(
             "The request's session was deleted before the "
             "request completed. The user may have logged "
             "out in a concurrent request, for example."
         )
     response.set_cookie(
         settings.SESSION_COOKIE_NAME,
         request.session.session_key, max_age=max_age,
         expires=expires, domain=settings.SESSION_COOKIE_DOMAIN,
         path=settings.SESSION_COOKIE_PATH,
         secure=settings.SESSION_COOKIE_SECURE or None,
         httponly=settings.SESSION_COOKIE_HTTPONLY or None,
         samesite=settings.SESSION_COOKIE_SAMESITE,
     )
    
  3. La boucle est ainsi bouclée: à la prochaine requête, la session sera récupérée à partir de l’ID de session dans les cookies.

Types d’authentification


Créer un utilisateur