• 10 heures
  • Difficile

Ce cours est visible gratuitement en ligne.

course.header.alt.is_video

course.header.alt.is_certifying

J'ai tout compris !

Mis à jour le 28/11/2023

Ajoutez l’authentification des utilisateurs

Découvrez JSON Web Token

L’authentification permet de rendre certains endpoints privés et accessibles seulement aux utilisateurs authentifiés. Ce qui est bien le cas pour notre boutique en ligne !

Nous souhaitons que les endpoints utiles aux visiteurs soient publics, cependant nous souhaitons disposer d'endpoints d’administration auxquels seuls les administrateurs de la plateforme pourront avoir accès. Nous ne souhaitons pas permettre aux visiteurs de modifier le prix d’un article avant de l’acheter, par exemple.

Nous allons donc mettre en place un système d’authentification basé sur JWT et la librairie Simple JWT qui est préconisée par DRF.

JWT est le sigle de JSON Web Token, qui est un jeton d’identification communiqué entre un serveur et un client. Il permet l’échange de données sécurisées entre ces derniers.

Dans le cadre de l’authentification, le JWT est utilisé pour s’assurer de l’identité de la personne réalisant la requête. Lorsque le serveur reçoit une requête, il vérifie alors la validité du token et détermine l’utilisateur à l’initiative de la requête. Le JWT permet d’identifier l’utilisateur à l’origine de la requête et permet ainsi de vérifier ses droits.

Ça ressemble à quoi, un JWT ?

Un JWT est constitué de 3 parties séparées par un point. Par exemple ce JWT :  eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ0b2tlbl90eXBlIjoicmVmcmVzaCIsImV4cCI6MTYyODk0ODE0NSwianRpIjoiODBmZTA4MDkxM2UxNDBjYmEwMDU4YWY4YmM5NjllZjYiLCJ1c2VyX2lkIjoxfQ.l31cs5pTApiR9R9s8pZaeyHIJuTmjcs07fxSqSpj1fQ

Chaque partie est encodée en base64, il est possible d’utiliser jwt.io pour les déchiffrer :

  • Le header, qui est en général constitué de deux attributs, indique le type de token et l'algorithme de chiffrement utilisé.
    Une fois décodé :

    {
        "typ": "JWT",
        "alg": "HS256"
    }
  • Le payload contient les informations utiles que nous souhaitons faire transiter entre le serveur et le client.
    Une fois décodé :

{
    "token_type": "refresh",
    "exp": 1628948145,
    "jti": "80fe080913e140cba0058af8bc969ef6",
    "user_id": 1
}
  • La signature est un élément de sécurité permettant de vérifier que les données n’ont pas été modifiées entre les échanges client-serveur. La clé permettant la génération de cette signature est stockée sur le serveur qui fournit le JWT (elle est basée sur la SECRET_KEY de Django).

La librairie Simple JWT va nous permettre d’authentifier nos utilisateurs et de leur fournir une paire de JWT :

  • Un access_token  qui va permettre de vérifier l’identité et les droits de l’utilisateur. Sa durée de vie est limitée dans le temps ;

  • Un refresh_token  qui va permettre d’obtenir une nouvelle paire de tokens une fois que l’ access_token  sera expiré.

Deux endpoints vont donc être mis à disposition par djangorestframework-simplejwt  :

  • Un endpoint d’authentification ;

  • Un endpoint de rafraîchissement de token.

Installez et configurez djangorestframework-simple-jwt

Prêt ? Eh bien on est parti ! Commençons sans attendre l’installation et la configuration de djangorestframework-simple-jwt  dans notre projet de boutique en ligne.

Commençons comme d’habitude par ajouter la dépendance au fichier requirements.txt.

djangorestframework-simplejwt==4.7.2

Puis, installons cette nouvelle dépendance avec la commande pip install -r requirements.txt.

Ajoutons la librairie dans les applications Django, et paramétrons DRF pour qu’il utilise notre librairie en tant que classe d’authentification.

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework',
    'rest_framework_simplejwt',
    'shop',
]
 
REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination',
    'PAGE_SIZE': 100,
    'DEFAULT_AUTHENTICATION_CLASSES': ('rest_framework_simplejwt.authentication.JWTAuthentication',)
}

Il ne nous reste plus qu’à définir nos URL d’obtention et de rafraîchissement de tokens dans urls.py  en les ajoutant à urlpatterns.

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api-auth/', include('rest_framework.urls')),
    path('api/token/', TokenObtainPairView.as_view(), name='token_obtain_pair'),
    path('api/token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),
    path('api/', include(router.urls))
]

L’installation et la configuration sont terminées, nous allons maintenant pouvoir jeter un œil à nos deux nouveaux endpoints.

En résumé

  • Les JWT permettent de transférer des informations du client au serveur en plus des jetons d’authentification.

  • djangorestframework-simplejwt  est une librairie permettant de gérer l’authentification, mais il en existe d’autres également conseillées par DRF.

  • Deux nouveaux endpoints d’obtention et de rafraîchissement de tokens fournis par Simple JWT permettent de gérer l’authentification de nos utilisateurs.

Maintenant que nous avons installé et configuré Simple JWT, créons des accès pour nos utilisateurs. Quand vous serez prêt, suivez-moi au prochain chapitre !

Exemple de certificat de réussite
Exemple de certificat de réussite