Crear un backend de autenticación para el login personalizado en Django

- Andrés Cruz

In english
Crear un backend de autenticación para el login personalizado en Django

En este punto seguramente saber que Django cuenta con un módulo de login que principalmente está pensado para trabajar con el admin; todo esto viene siendo de gratis al crear simplemente un proyecto en Django, ya que aplicaciones como la de admin y login (auth):

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

Vienen de gratis al momento de crear un proyecto en Django, ahora, seguramente en algún punto te interese crear un proceso personalizado para el login, ya sea en reemplazo del original, o más interesante, para emplearlo en paralelo; para esto en nuestro archivo de configuraciones; settings.py, tenemos el siguiente apartado (que tenemos que agregar si queremos crear un login personalizado en Django):

AUTHENTICATION_BACKENDS = [
    'django.contrib.auth.backends.ModelBackend',
    'account.authentication.AuthByEmailBackend',
]

En el cual podemos configurar nuestros backends de autenticación o para realizar el login, como lo quieras ver; como puedes ver, es una lista, un iterable por lo tanto podemos definir más de uno y esto es excelente ya que Django va a ir uno a uno preguntando por la combinación de usuario y contraseña que establezcamos en la aplicación uno a uno, y si el primero en la lista de falso va por el segundo y así hasta cubrirlos todos; como puedes ver, es un comportamiento que nos permite extender el funcionamiento básico de una aplicación en Django para el manejo del login.

El primer backend que define, sería el que emplea Django por defecto; el siguiente sería un archivo que define una clase que vamos a crear en esta entrada.

Creando nuestra clase de autenticación (Login personalizado)

En esta entrada vamos a ver como crear un backend personalizado con Django; para esto, lo primero que tenemos que hacer es crear una clase, es básicamente todo lo que necesitamos, una clase que luego podemos registrar en el listado que vimos anteriormente sobre nuestro settings.py; esta clase la crear claro está en un archivo con cualquier nombre y que puede estar en cualquier aplicación de tu proyecto; por ejemplo, una aplicación llamada:

python manage.py startapp account

En la cual vamos a crear un archivo llamado authentication.py con el siguiente contenido:

from django.contrib.auth.models import User
"""
    Login via email
"""
class AuthByEmailBackend:

    def authenticate(self, request, username=None, password=None):

        try:
            user = User.objects.get(email=username)
            if user.check_password(password):
                return user
        except User.DoesNotExist:
            return None

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

Explicar el código anterior

Como puedes ver, es una clase cualquiera, no tenemos que heredar de nada, pero si tiene que tener un método con el nombre de authenticate que reciba el request, por si quieres pasar algún dato adicional, y de manera obligatoria el usuario y la contraseña.

Por lo demás, todo queda en hacer las comprobaciones que quieras hacer para el login, en este ejemplo, para expandir la aplicación, buscamos también por el email y luego chequeamos pos el hash del password que emplea internamente Django para la creación de los usuarios; ahora con esto, vamos a nuestro settings.py y agregamos la referencia a la nueva clase:

AUTHENTICATION_BACKENDS = [
    'django.contrib.auth.backends.ModelBackend',
    'user.authentication.AuthByEmailBackend'
]

Recuerda que en tu backend personalizado puedes definir cualquier tipos de reglas para hacer tu login personalizado.

Andrés Cruz

Desarrollo con Laravel, Django, Flask, CodeIgniter, HTML5, CSS3, MySQL, JavaScript, Vue, Android, iOS, Flutter

Andrés Cruz en Udemy

Acepto recibir anuncios de interes sobre este Blog.