Maison >développement back-end >Tutoriel Python >Guide étape par étape de l'authentification utilisateur avec Django, Djoser et JWT : partie I

Guide étape par étape de l'authentification utilisateur avec Django, Djoser et JWT : partie I

Patricia Arquette
Patricia Arquetteoriginal
2024-12-27 12:24:11262parcourir

L'authentification et la gestion des utilisateurs sont des fonctionnalités fondamentales lors du démarrage d'un nouveau projet. Ces tâches étant souvent répétées, divers packages ont été développés pour rationaliser le processus, permettant aux développeurs de se concentrer sur d'autres aspects de leurs projets. L'un de ces packages est Djoser, qui s'intègre parfaitement à Django REST Framework (DRF) pour gérer l'authentification et la gestion des utilisateurs. Dans ce guide, je vais vous guider dans la création d'un système d'authentification complet des utilisateurs à l'aide de Djoser, y compris la configuration de la fonctionnalité de messagerie et des modèles de courrier électronique personnalisés.

Mise en place du projet

Commencez par créer un répertoire pour votre projet :

mkdir userauth

Accédez au nouveau répertoire dans votre IDE préféré, configurez un environnement virtuel et activez-le

python venv .venv
source .venv/bin/activate

Ensuite, installez les packages nécessaires :

pip install django djangorestframework djoser djangorestframework_simplejwt social-auth-app-django drf-yasg

Remarque : Certaines dépendances, telles que social-auth-app-django, peuvent être installées automatiquement avec Djoser. Si tel est le cas, vous pouvez ignorer leur ajout explicite

Une fois installé, générez un fichier exigences.txt pour suivre vos dépendances :

pip freeze > requirements.txt

Vous devriez voir tous les packages installés répertoriés dans le fichier exigences.txt, y compris toutes les dépendances.

Créez le projet Django et faites fonctionner le serveur

django-admin startapp userauth . 

Cela créera le projet Django. Nous devons ensuite créer une application dans notre projet

python manage.py startapp accounts

Le répertoire de votre projet devrait maintenant contenir les éléments suivants :

  • .venv (environnement virtuel)

  • comptes/ (application d'authentification)

  • userauth/ (dossier principal du projet)

  • manage.py

  • requirements.txt

Configuration du projet

Ajoutez les packages et applications requis à la section INSTALLED_APPS dans settings.py :

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

     # Third Party Apps
    'rest_framework',
    'djoser',
    'rest_framework_simplejwt',
    'drf_yasg',

    # Local Apps
    'accounts',
]

Mettez à jour votre settings.py pour inclure les configurations pour Django REST Framework et SimpleJWT :

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

Créons notre modèle utilisateur personnalisé depuis
créer le fichier managers.py dans le dossier des comptes
comptes/managers.py

from django.contrib.auth.models import BaseUserManager


class CustomUserManager(BaseUserManager):

    def create_user(self, email, username, password=None, **extra_fields) -> None:

        if not username:
            raise ValueError("Username is required")

        if not email:
            raise ValueError("Email is required")


        email = self.normalize_email(email)
        user = self.model(email=email, username=username, **extra_fields)
        user.set_password(password)
        user.save()
        return user


    def create_superuser(self, email, username, password, **extra_fields):
        """
        Create and save a SuperUser with the given email and password.
        """
        extra_fields.setdefault("is_staff", True)
        extra_fields.setdefault("is_superuser", True)
        extra_fields.setdefault("is_active", True)

        if extra_fields.get("is_staff") is not True:
            raise ValueError("Superuser must have is_staff=True.")

        if extra_fields.get("is_superuser") is not True:
            raise ValueError("Superuser must have is_superuser=True.")

        return self.create_user(email, username, password, **extra_fields)

comptes/models.py

from django.db import models
from django.contrib.auth.models import AbstractUser
from accounts.managers import CustomUserManager



class CustomUser(AbstractUser):
    username = None
    email = models.EmailField(unique=True)
    is_verified = models.BooleanField(default=False)


    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = []

    objects = CustomUserManager()


    def __str__(self):
        return self.email

Ajoutez cette ligne dans votre fichier settings.py

AUTH_USER_MODEL = 'accounts.CustomUser'

Nous pouvons procéder à nos migrations puis exécuter le serveur de développement local

python manage.py makemigrations
python manage.py migrate
python manage.py runserver

Il ne devrait y avoir aucun problème jusqu'à présent.

Configuration des URL Djoser

Incluez les URL fournies par Djoser dans les modèles d'URL de votre projet, ainsi que la documentation Swagger pour l'API :

userauth/urls.py

from django.contrib import admin
from django.urls import include, path
from rest_framework import permissions
from drf_yasg.views import get_schema_view
from drf_yasg import openapi


schema_view = get_schema_view(
    openapi.Info(
        title="User Accounts API",
        default_version="v1",
        description="REST implementation of Django authentication system using Djoser",
        contact=openapi.Contact(email="contact@snippets.local"),
        license=openapi.License(name="BSD License"),
    ),
    public=True,
    permission_classes=(permissions.AllowAny,),
)

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/docs', schema_view.with_ui("swagger", cache_timeout=0), name="swagger-ui"),
    path('api/', include('djoser.urls')), 
    path('api/', include('djoser.urls.jwt'))
]

Allez sur http://127.0.0.1:8000/api/docs/ dans votre navigateur pour consulter la documentation de l'API.

Configuration des paramètres de Djoser

Tous les paramètres pouvant être configurés pour Djoser peuvent être trouvés ici Paramètres de Djoser

userauth/settings.py

mkdir userauth

Ici, nous demandons aux utilisateurs de recevoir un e-mail d'activation. L'URL d'activation est le lien envoyé à l'e-mail de l'utilisateur pour qu'il puisse cliquer. Le jeton et l'uid doivent être extraits et une demande de publication envoyée avec eux comme corps de la route d'activation dans votre projet

Configuration de l'envoi d'e-mails

Enfin, nous devons configurer l'envoi d'e-mails. J'utiliserai mailtrap pour l'envoi d'e-mails. Vous pouvez choisir d'envoyer l'e-mail à la console ou au service de messagerie de votre choix.

Pour envoyer l'e-mail à votre console

python venv .venv
source .venv/bin/activate

Utilisation d'un service de messagerie externe

pip install django djangorestframework djoser djangorestframework_simplejwt social-auth-app-django drf-yasg

Remplacez les espaces réservés par les informations d'identification correctes

Pour tester cela, nous utiliserons Postman pour le tester.

Créer un nouvel utilisateur

Step-by-Step Guide to User Authentication with Django, Djoser, and JWT: Part I

Puis l'email d'activation envoyé à l'utilisateur

Step-by-Step Guide to User Authentication with Django, Djoser, and JWT: Part I

Personnalisation des modèles d'e-mails

Personnalisons un peu le modèle d'e-mail
Créez un dossier de modèles dans le répertoire des comptes, puis créez un dossier de courrier électronique et continuez à y créer un dossier de modèles

comptes/templates/email/activation_email.py
Nous personnalisons l'e-mail par défaut fourni avec djoser

pip freeze > requirements.txt

Pour personnaliser le nom du site dans le modèle, ajoutez cette ligne au paramètre djoser

django-admin startapp userauth . 

Le modèle d'e-mail ressemble maintenant à ceci

Step-by-Step Guide to User Authentication with Django, Djoser, and JWT: Part I

Extension de la vue d'activation

Pour la dernière partie de cet article, travaillons sur la vérification des emails.
Nous commençons par personnaliser la vue d'activation dans comptes/views.py :

comptes/views.py

python manage.py startapp accounts

Nous étendons la vue d'activation sur djoser pour la personnaliser et définissons le champ is_verified sur notre modèle utilisateur sur true

comptes/urls.py

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

     # Third Party Apps
    'rest_framework',
    'djoser',
    'rest_framework_simplejwt',
    'drf_yasg',

    # Local Apps
    'accounts',
]

Fichier Urls au niveau du projet
userauth/urls.py

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

Pour tester cela, créez un nouvel utilisateur test et cliquez sur l'URL d'activation envoyée à l'e-mail.
Vous arrivez sur cette page, car l'url n'existe pas dans notre projet

Step-by-Step Guide to User Authentication with Django, Djoser, and JWT: Part I

à partir de l'url, extrayez l'uid et le jeton et faites une demande de publication sur la route d'activation que vous avez définie dans votre fichier comptes/urls.py

d'après la capture d'écran, mon itinéraire est :

mkdir userauth

L'uid est MTY
Le jeton est cil456-aaf8331efb885f0b4412f35ce544648c

Utilisation des paramètres pour faire une demande de publication sur le point de terminaison d'activation

Step-by-Step Guide to User Authentication with Django, Djoser, and JWT: Part I

Ceci conclut le tutoriel de configuration de l'authentification des utilisateurs avec Djoser. Vous disposez désormais d'un système d'authentification fonctionnel avec activation par e-mail et modèles personnalisables. Dans la deuxième partie de cette série, nous explorerons l'authentification sociale, permettant aux utilisateurs de s'inscrire et de se connecter à l'aide de services tiers tels que Google, Facebook et GitHub. Restez à l'écoute pour en savoir plus !

Si vous avez des questions ou des commentaires, n'hésitez pas à laisser un commentaire.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn