Formation incluse

Utilisation d’adresse e-mail pour l’authentification avec Django

Kevin TIAKOUANG DJOU
Kevin TIAKOUANG DJOU
23 Octobre 2024 · 15,63 min lecture
31
Django
Utilisation d’adresse e-mail pour l’authentification avec Django

1. Introduction au problème


De nombreuses applications préfèrent utiliser les emails plutôt que des noms d'utilisateur car cela simplifie l'authentification et garantit l'unicité des comptes. L'email est plus facile à mémoriser, évite les conflits de noms d'utilisateur, centralise les communications (comme les réinitialisations de mot de passe), et facilite l'intégration avec des systèmes modernes comme le single sign-on (SSO). Cela rend l'inscription et la connexion plus fluides et sécurisées.


 

2. Création du projet Django


    2.1. Créer un nouveau projet Django 

Ouvre ton terminal et exécute la commande suivante pour démarrer un projet :  django-admin startproject myproject  

    2.2. Se déplacer dans le répertoire du projet 

   Accède au répertoire du projet créé : cd myproject

    2.3. Créer une nouvelle application Django 

   Crée une application nommée `users` qui gérera l'authentification des utilisateurs : python manage.py startapp users


 

3. Personnalisation du modèle utilisateur


Dans `models.py`, crée un modèle utilisateur personnalisé basé sur l'email :

from django.contrib.auth.models import AbstractBaseUser, BaseUserManager, PermissionsMixin

from django.db import models

 

class UserManager(BaseUserManager):

    def create_user(self, email, password=None, extra_fields):

        if not email:

            raise ValueError('The Email field must be set')

        email = self.normalize_email(email)

        user = self.model(email=email, extra_fields)

        user.set_password(password)

        user.save(using=self._db)

        return user

 

    def create_superuser(self, email, password=None, extra_fields):

        extra_fields.setdefault('is_staff', True)

        extra_fields.setdefault('is_superuser', True)

        return self.create_user(email, password, extra_fields)

 

class User(AbstractBaseUser, PermissionsMixin):

    email = models.EmailField(unique=True)

    is_active = models.BooleanField(default=True)

    is_staff = models.BooleanField(default=False)

 

    objects = UserManager()

 

    USERNAME_FIELD = 'email'

    REQUIRED_FIELDS = []

 

    def __str__(self):

        return self.email


 

4. Configuration du modèle dans Django


Ensuite, indique à Django d'utiliser ce modèle personnalisé dans `settings.py` :

AUTH_USER_MODEL = 'users.User'


 

5. Formulaires d'inscription et de connexion


Dans `forms.py`, personnalise les formulaires pour l'inscription et la connexion avec l'email comme champ principal :

from django.contrib.auth.forms import UserCreationForm, AuthenticationForm

from .models import User

 

class CustomUserCreationForm(UserCreationForm):

    class Meta:

        model = User

        fields = ('email',)

 

class CustomAuthenticationForm(AuthenticationForm):

    class Meta:

        model = User

        fields = ('email', 'password')


 

6. Mise à jour des vues


Mets à jour les vues pour utiliser les nouveaux formulaires :

from django.urls import reverse_lazy

from django.views.generic.edit import CreateView

from .forms import CustomUserCreationForm

 

class SignUpView(CreateView):

    form_class = CustomUserCreationForm

    success_url = reverse_lazy('login')

    template_name = 'registration/signup.html'


 

7. Tests et démonstration


from django.test import TestCase

from django.contrib.auth import get_user_model

from django.urls import reverse

 

class UserTests(TestCase):

   

    def setUp(self):

        self.email = 'testuser@example.com'

        self.password = 'Testpass123'

        self.user = get_user_model().objects.create_user(

            email=self.email,

            password=self.password

        )

   

    def test_create_user_with_email(self):

        """Vérifie qu'un utilisateur peut être créé avec une adresse email"""

        user = get_user_model().objects.get(email=self.email)

        self.assertEqual(user.email, self.email)

        self.assertTrue(user.check_password(self.password))

   

    def test_user_login(self):

        """Teste la connexion de l'utilisateur avec l'email et le mot de passe"""

        login = self.client.login(email=self.email, password=self.password)

        self.assertTrue(login)

   

    def test_signup_view(self):

        """Teste l'affichage de la page d'inscription et la création d'un utilisateur"""

        response = self.client.get(reverse('users:signup'))

        self.assertEqual(response.status_code, 200)

        self.assertTemplateUsed(response, 'registration/signup.html')

 

        new_user_email = 'newuser@example.com'

        response = self.client.post(reverse('users:signup'), {

            'email': new_user_email,

            'password1': 'Newpass123',

            'password2': 'Newpass123'

        })

        self.assertEqual(response.status_code, 302# Redirection après inscription

        new_user = get_user_model().objects.get(email=new_user_email)

        self.assertEqual(new_user.email, new_user_email)


 

8. Conclusion

Utiliser des emails pour l'authentification simplifie la gestion des comptes et améliore l'expérience utilisateur. Cette approche peut également être étendue à d'autres méthodes, comme l'authentification par numéro de téléphone ou les connexions via des réseaux sociaux. Dans l'aticle suivant, nous verrons ensemble comment integrer une verification de l'email specifier par l'utilisateur lors de l'inscription.

Cliquer ici pour accéder au dépôt github qui donne le code complet realiser dans cet article.

 

31

Applaudissez pour montrer votre soutien

Kevin TIAKOUANG DJOU

Kevin TIAKOUANG DJOU

2 Suivez-nous · Rédacteur pour Django

Passionné de Django pour sa facilité à créer des applications web robustes, je serais ravi de mettre mes compétences en Python-Django au service to… Lire la suite