1
resposta

[Dúvida] Como fazer para trocar autenticação de username para email?

Por algum motivo, quanto troco os atributos de autenticação para email, o código não funciona. Quando troquei o email por username, funcionou e eu achei muito estranho. Esse é o código do views.py:

def login(request):
    form = LoginForms()

    if request.method == 'POST':
        form = LoginForms(request.POST)

        if form.is_valid():
            email_login = form['email_login'].value()
            senha_login = form['senha_login'].value()

        usuario = auth.authenticate(
            request,
            email = email_login,
            password = senha_login
        )

        if usuario is not None:
            auth.login(request, usuario)
            return redirect('index')
        else:
            return redirect('login')

    return render(request, 'login.html', {'form': form})

E esse é o código do forms.py:

class LoginForms(forms.Form):
    email_login=forms.EmailField(
        required=True,
        max_length=100,
        widget=forms.EmailInput(
            attrs={
                'class': 'login-input',
                'placeholder': 'Email',
            }
        )
    )
    senha_login=forms.CharField(
        required=True,
        max_length=70,
        widget=forms.PasswordInput(
            attrs={
                'class': 'login-input',
                'placeholder': 'Senha',
            }
        )
    )
1 resposta

Oi, Mariana! Tudo bem?

Trocar a autenticação de username para email pode ser um pouco complicado se alguns detalhes não forem ajustados. Vou te ajudar a resolver isso!

Primeiro, para autenticar usuários pelo email, você precisa garantir que o método authenticate saiba que deve procurar pelo email em vez do username. Para isso, você pode criar um backend de autenticação personalizado. Vou te mostrar como fazer isso.

  1. Crie um arquivo backends.py na sua aplicação de usuários (por exemplo, usuarios/backends.py) e adicione o seguinte código:
from django.contrib.auth.backends import ModelBackend
from django.contrib.auth import get_user_model

class EmailBackend(ModelBackend):
    def authenticate(self, request, email=None, password=None, **kwargs):
        UserModel = get_user_model()
        try:
            user = UserModel.objects.get(email=email)
        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
  1. Adicione o backend personalizado ao seu arquivo de configurações (settings.py):
AUTHENTICATION_BACKENDS = [
    'django.contrib.auth.backends.ModelBackend',
    'usuarios.backends.EmailBackend',  # Adicione esta linha
]
  1. Ajuste sua view de login (views.py) para usar o campo email em vez de username:
from django.shortcuts import render, redirect
from django.contrib import auth
from .forms import LoginForms

def login(request):
    form = LoginForms()

    if request.method == 'POST':
        form = LoginForms(request.POST)

        if form.is_valid():
            email_login = form.cleaned_data['email_login']
            senha_login = form.cleaned_data['senha_login']

            usuario = auth.authenticate(
                request,
                email=email_login,
                password=senha_login
            )

            if usuario is not None:
                auth.login(request, usuario)
                return redirect('index')
            else:
                return redirect('login')

    return render(request, 'login.html', {'form': form})
  1. Certifique-se de que o formulário (forms.py) está correto:
from django import forms

class LoginForms(forms.Form):
    email_login = forms.EmailField(
        required=True,
        max_length=100,
        widget=forms.EmailInput(
            attrs={
                'class': 'login-input',
                'placeholder': 'Email',
            }
        )
    )
    senha_login = forms.CharField(
        required=True,
        max_length=70,
        widget=forms.PasswordInput(
            attrs={
                'class': 'login-input',
                'placeholder': 'Senha',
            }
        )
    )

Com essas mudanças, seu sistema de autenticação deve funcionar corretamente usando o email em vez do username.

Espero ter ajudado e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.