102 votes

Django - Connexion avec l'email

Je veux que django authentifie les utilisateurs par e-mail, et non par nom d'utilisateur. Une façon de faire est de fournir la valeur de l'email comme valeur du nom d'utilisateur, mais je ne veux pas cela. La raison en est que j'ai une url /profile/<username>/ donc je ne peux pas avoir d'url /profile/abcd@gmail.com/ .

Une autre raison est que tous les emails sont uniques, mais il arrive parfois que le nom d'utilisateur soit déjà pris. C'est pourquoi je crée automatiquement le nom d'utilisateur en tant que fullName_ID .

Comment puis-je changer le fait que Django s'authentifie avec l'email ?

Voici comment je crée un utilisateur.

username = `abcd28`
user_email = `abcd@gmail.com`
user = User.objects.create_user(username, user_email, user_pass)

C'est ainsi que je me connecte.

email = request.POST['email']
password = request.POST['password']
username = User.objects.get(email=email.lower()).username
user = authenticate(username=username, password=password)
login(request, user)

Existe-t-il un autre moyen de se connecter, à part obtenir le nom d'utilisateur en premier ?

0voto

Pour Django 2

username = get_object_or_404(User, email=data["email"]).username
        user = authenticate(
            request, 
            username = username, 
            password = data["password"]
        )
        login(request, user)

0voto

Shakil Ahmmed Points 63

Authentification par courriel pour Django 2.x

def admin_login(request):
if request.method == "POST":
    email = request.POST.get('email', None)
    password = request.POST.get('password', None)
    try:
        get_user_name = CustomUser.objects.get(email=email)
        user_logged_in =authenticate(username=get_user_name,password=password)
        if user_logged_in is not None:
            login(request, user_logged_in)
            messages.success(request, f"WelcomeBack{user_logged_in.username}")
            return HttpResponseRedirect(reverse('backend'))
        else:
            messages.error(request, 'Invalid Credentials')
            return HttpResponseRedirect(reverse('admin_login'))
    except:
        messages.warning(request, 'Wrong Email')
        return HttpResponseRedirect(reverse('admin_login'))

else:
    if request.user.is_authenticated:
        return HttpResponseRedirect(reverse('backend'))
    return render(request, 'login_panel/login.html')

0 votes

Pouvez-vous ajouter un peu de texte pour expliquer ce que fait votre réponse et comment elle contribue à répondre à la question ?

0 votes

Édité . Merci

0voto

sagar rathod Points 1

Si vous avez créé une base de données personnalisée, à partir de là, si vous voulez valider votre identifiant de messagerie et votre mot de passe.

  1. Récupérer l'adresse e-mail et le mot de passe avec models.objects.value_list('db_columnname').filter(db_emailname=textbox email)

2. assignation dans la liste récupérée object_query_list

Convertir une liste en chaîne

Ex :

  1. Prenez le Html Email_id y Password Valeurs en Views.py

    u_email = request.POST.get('uemail')

    u_pass = request.POST.get('upass')

  2. Récupérer l'identifiant et le mot de passe de la base de données.

    Email = B_Reg.objects.values_list('B_Email',flat=True).filter(B_Email=u_email)

    Password = B_Reg.objects.values_list('Password',flat=True).filter(B_Email=u_email)

  3. Prenez les valeurs de l'Email id et du mot de passe dans la liste de l'écran. Query valeur établie

    Email_Value = Email[0]

    Password_Value=Password[0]

  4. Convertir la liste en chaîne

    string_email = ''.join(map(str, Email_Value))

    string_password = ''.join(map(str, Password_Value))

Enfin, votre condition de connexion

if (string_email==u_email and string_password ==u_pass)

0voto

Casman Ridder Points 21

C'est assez simple. Il n'est pas nécessaire de suivre des cours supplémentaires.

Lorsque vous créez et mettez à jour un utilisateur avec une adresse électronique, il suffit de définir le champ du nom d'utilisateur avec l'adresse électronique.

Ainsi, lorsque vous vous authentifiez, le champ du nom d'utilisateur aura la même valeur que l'e-mail.

Le code :

# Create
User.objects.create_user(username=post_data['email'] etc...)

# Update
user.username = post_data['email']
user.save()

# When you authenticate
user = authenticate(username=post_data['email'], password=password)

2 votes

Veuillez ajouter un exemple de code pour aider à démontrer comment votre réponse peut aider à résoudre le problème.

2 votes

@CasmanRidder Votre réponse sera supprimée si vous n'ajoutez pas d'informations supplémentaires.

0voto

bitFez Points 60

Il semble que la méthode pour le faire ait été mise à jour avec Django 3.0.

Une méthode de travail pour moi a été :

authentication.py # <-- Je l'ai placé dans une application (ne fonctionne pas dans le dossier du projet à côté de settings.py)

from django.contrib.auth import get_user_model
from django.contrib.auth.backends import BaseBackend
from django.contrib.auth.hashers import check_password
from django.contrib.auth.models import User

class EmailBackend(BaseBackend):
    def authenticate(self, request, username=None, password=None, **kwargs):
        UserModel = get_user_model()
        try:
            user = UserModel.objects.get(email=username)
        except UserModel.DoesNotExist:
            return None
        else:
            if user.check_password(password):
                return user
        return None

    def get_user(self, user_id):
        UserModel = get_user_model()
        try:
            return UserModel.objects.get(pk=user_id)
        except UserModel.DoesNotExist:
            return None

Puis j'ai ajouté ceci au fichier settings.py

AUTHENTICATION_BACKENDS = (
    'appname.authentication.EmailBackend',
)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X