es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Autenticación de Django para utilizar tanto el correo electrónico como el nombre de usuario.

He estado casi terminando mi aplicación de django-react con todos los modelos, serializadores y APIs. Pero ahora necesito cambiar el método de autenticación para también utilizar el correo electrónico.

class User(AbstractUser):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
email = models.EmailField(unique=True)

# Observa que no existe campo de usuario (username) porque está incluido en AbstractUser

He revisado algunas posibles soluciones, pero estas involucran el uso de AbstractBaseUser, mientras que otras escriben un backend de autenticación personalizado que omite completamente el campo de usuario (username). Esto podría afectar otras vistas y el frontend ya que hemos estado principalmente usando el campo de usuario.

Aún quiero mantener el campo de usuario (username) y usar tanto este como el correo electrónico para autenticar.

¿Existe alguna idea sencilla (preferiblemente manteniendo el uso de AbstractUser) que no requiera cambios mayores?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, puedes usar AbstractUser para autenticarte tanto con nombre de usuario como con correo electrónico. Puedes agregar un backend de autenticación personalizado que verifique tanto el nombre de usuario como el correo electrónico al autenticar un usuario. De esta manera, puedes seguir utilizando AbstractUser y no tendrás que hacer cambios mayores.

    Aquí tienes un ejemplo de un backend de autenticación personalizado que verifica tanto el nombre de usuario como el correo electrónico:

    from django.contrib.auth.backends import ModelBackend
    
    class EmailOrUsernameModelBackend(ModelBackend):
        def authenticate(self, request, username=None, password=None, **kwargs):
            if '@' in username:
                kwargs = {'email': username}
            else:
                kwargs = {'username': username}
            try:
                user = User.objects.get(**kwargs)
                if user.check_password(password):
                    return user
            except User.DoesNotExist:
                return None
    

    Luego, puedes agregar este backend de autenticación a tu archivo settings.py:

    AUTHENTICATION_BACKENDS = [
        'path.to.EmailOrUsernameModelBackend',
    ]
    

    De esta manera, puedes autenticarte tanto con el nombre de usuario como con el correo electrónico utilizando AbstractUser.

Comments are closed.