Implémenter l'Authentification JWT avec Djoser dans Django

L'authentification est un élément crucial de la plupart des applications web modernes. Dans cet article, nous allons explorer comment implémenter l'authentification JWT (JSON Web Tokens) dans un projet Django en utilisant Djoser, un package Django pratique pour la gestion des utilisateurs.

Qu'est-ce que JWT ?

JWT (JSON Web Token) est une norme ouverte (RFC 7519) qui définit une manière compacte et autonome de transmettre en toute sécurité des informations entre les parties sous forme d'objet JSON. Cette information peut être vérifiée et de confiance car elle est signée numériquement.

Pourquoi Utiliser Djoser ?

Djoser est une bibliothèque Django qui facilite la création d'endpoints REST pour l'authentification et la gestion des utilisateurs, en utilisant des tokens JWT pour l'authentification.

 

Installation des Dépendances

Installez Djoser et djangorestframework-simplejwt :

pip install djoser djangorestframework-simplejwt

 

Configuration des Paramètres Django

Ajoutez `rest_framework`, `rest_framework.authtoken`, et `djoser` à `INSTALLED_APPS` dans votre `settings.py` :

   INSTALLED_APPS = [
       # ... autres applications ...
       'rest_framework',
       'rest_framework.authtoken',
       'djoser',
   ]

Configurez Django REST Framework et Djoser dans `settings.py` :
 

   REST_FRAMEWORK = {
       'DEFAULT_AUTHENTICATION_CLASSES': (
           'rest_framework_simplejwt.authentication.JWTAuthentication',
       ),
   }

   DJOSER = {
       'LOGIN_FIELD': 'email',
       'USER_CREATE_PASSWORD_RETYPE': True,
       'SERIALIZERS': {
           'user_create': 'yourapp.serializers.UserCreateSerializer',
           'user': 'yourapp.serializers.UserSerializer'
       },
   }

   Remplacez `'yourapp.serializers.UserCreateSerializer'` et `'yourapp.serializers.UserSerializer'` par les chemins de vos propres serializers.

Ajouter une validation par email

J'ai aussi rajouté une validation par email. L'utilisateur, après inscription, reçoit un email avec une URL pour valider son inscription : 

DJOSER = {
    "USER_ID_FIELD": "email",
    "LOGIN_FIELD": "email",
    "SEND_ACTIVATION_EMAIL": True,
    "ACTIVATION_URL": "accounts/activate/{uid}/{token}",

Il faut dans ce cas ajouter la configuration SMTP dans settings.py

# SMTP CONFIGURATION
EMAIL_BACKEND = "django.core.mail.backends.smtp.EmailBackend"
EMAIL_HOST = env.str("EMAIL_HOST")
EMAIL_PORT = env.int("EMAIL_PORT")
EMAIL_USE_TLS = True
EMAIL_HOST_USER = env.str("EMAIL_HOST_USER")
EMAIL_HOST_PASSWORD = env.str("EMAIL_HOST_PASSWORD")

 

Configuration des URLs

1. Ajoutez les URL de Djoser et JWT à votre fichier `urls.py` :

 from django.urls import path, include

   urlpatterns = [
       # ... autres urls ...
       path('auth/', include('djoser.urls')),
       path('auth/', include('djoser.urls.jwt')),
       # ajouter l'URL d'activation envoyée par email à l'utilisateur
       path('accounts/activate/<uid>/<token>',
         ActivateUser.as_view({'get': 'activation'}), name='activation'),
   ]

 

Déconnection de l'utilisateur et blacklist du token

Afin d'augmenter la sécurité, JWT permet la mise dans une blacklist du token lors de la déconnexion de l'utilisateur.
Il suffit d'ajouter une vue : 

from rest_framework_simplejwt.tokens import RefreshToken
from rest_framework.views import APIView
from rest_framework.permissions import IsAuthenticated, AllowAny
from rest_framework.response import Response


class LogoutAPIView(APIView):
    permission_classes = [AllowAny]
    """logout view that blacklists the refresh token when the user logs out
    """

    def post(self, request):
        refresh_token = request.data.get('refresh')
        if refresh_token:
            try:
                token = RefreshToken(refresh_token)
                token.blacklist()
                return Response({'detail': 'Déconnexion réussie.'}, status=200)
            except Exception as e:
                return Response({'detail': str(e)}, status=400)
        else:
            return Response({'detail': "Le paramètre Token 'refresh' est manquant."}, status=400)

Puis de la lier à une URL

    path('auth/logout/', LogoutAPIView.as_view(), name='logout'),

 

Avec Djoser et JWT, vous pouvez rapidement mettre en place une authentification sécurisée pour votre application Django.