Registro, login y logout de usuarios con Django Rest Framework y JWT (parte III)

En el post anterior, vimos como DRF puede gestionar fácilmente los tokens de usuario que se generan cuando este se valida en nuestra plataforma, incluyéndolos en listas negras para que no se puedan volver a usar.

En esta tercera entrega de la serie vamos a ver como podemos registrar usuarios, usando las capacidades de la API.

En primer lugar, y siguiendo con el ejemplo que estamos usando en estos artículos, vamos a crear un serializer que nos permita conectar con la base de datos y mediante un método create, vamos a dar de alta el usuario.

Para ello en el directorio de nuestra aplicación (users, en este caso), crearemos un fichero llamado serializers.py que se encargará de recoger la petición.

El contenido del fichero será como mínimo el siguiente:

# Importar el módulo de serializadores del Django Rest Framework
from rest_framework import serializers  
# Importar el modelo de usuario de la autenticación incorporada de Django
from django.contrib.auth.models import User  

# Crear una clase de serializador personalizada llamada UserRegistrationSerializer que hereda de serializers.ModelSerializer
class UserRegistrationSerializer(serializers.ModelSerializer):
    # Definir un campo llamado 'password' con acceso de escritura (no se muestra en las respuestas)
    password = serializers.CharField(write_only=True)

    # Definir metadatos para el serializador
    class Meta:
        model = User  # Especificar que este serializador es para el modelo User
        fields = ('username', 'password', 'email')  # Especificar los campos del modelo User que se incluirán en los datos serializados

    # Definir un método personalizado 'create' para manejar la creación de un nuevo objeto User
    def create(self, validated_data):
        # Crear un nuevo objeto User utilizando el método 'create_user' del gestor de usuarios
        user = User.objects.create_user(
            username=validated_data['username'],  # Establecer el nombre de usuario a partir de los datos validados
            password=validated_data['password'],  # Establecer la contraseña a partir de los datos validados
            email=validated_data['email']  # Establecer el correo electrónico a partir de los datos validados
        )
        return user  # Devolver el objeto User creado

Es importante definir bien esta parte del código:

# Definir metadatos para el serializador
    class Meta:
        model = User  # Especificar que este serializador es para el modelo User
        fields = ('username', 'password', 'email')  

Los campos que vamos a solicitar en el registro, deben existir en el modelo de datos.

Una vez tengamos el serializer configurado, crearemos una vista que nos permita gestionar la repuesta y el acceso a al registro del usuario. Dentro del fichero views.py de la aplicación donde estemos montado el sistema de login (users, en nuestro caso), incluiremos lo siguiente:

# Importamos el serializer anterior
from .serializers import UserRegistrationSerializer

# Creamos la vista para el registro
class UserRegistrationView(generics.CreateAPIView):
    queryset = User.objects.all()
    serializer_class = UserRegistrationSerializer

    def create(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            # Si el registro ha sido OK, se devolverá un mensaje 
            return Response({'message': 'Usuario registrado correctamente'}, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

Y finalmente, creamos la llamada al path correspondiente para poder acceder al endpoint, en el fichero urls.py de users

from django.urls import path
from .views import LogoutView, CustomTokenObtainPairView,UserRegistrationView

urlpatterns = [
    # URL PARA EL REGISTRO
    path('register/', UserRegistrationView.as_view(), name='user-registration'),
    # URL PARA EL LOGOUT
    path('logout/', LogoutView.as_view(), name='logout_token'),
]

Una vez montado todo y con el servidor arrancado, vamos a probar las urls y que el funcionamiento sea el esperado.

Primero vamos a ver el acceso al registro desde la propia interfaz de DRF:

Vemos las urls que están disponibles para la aplicación users, en concreto vamos a acceder a http://localhost:8080/users/register/

Como vemos, disponemos directamente de un formularioque nos permitirá hacer el registro básico del usuario, con los campos que le hemos indicado en el serializer: username, password y email.

Una vez completado el formulario y enviado, obtenemos una respuesta positiva al registro del usuario:

Una vez registrado este, vamos a probar ha realizar el login, con las credenciales que hemos asignado al usuario, para comprobar que está correctamente registrado en nuestra aplicación:

Y comprobamos finalmente que el login del usuario, nos devuelve los tokens access y token refresh que habíamos configurado en los posts anteriores.

Y de esta forma, comprobamos que el registro y el login del usuario se ha efectuado correctamente.

No está de más, comprobar tanto el registro como el login del nuevo usuario a través de Postman

Pasamos un json como carga para el registro y la API nos responde con el mensaje de que el usuario se ha registrado correctamente.

Y cuando accedemos al login, vemos que nos devuelve correctamente los tokens.

En el post de hoy, hemos visto como registrar usuarios, usando las capacidades de la API que hemos creado con DRF. Como podeís ver es todo bastante automatizado y la cantidad de código necesaria es relativamente corta.

En el próximo y último post de esta serie, veremos como extender el modelo del usuario para poder gestionar más datos del usuario que no existen en el modelo original de Django y como devolver esa información.

Publicada el
Categorizado como Desarollo Etiquetado como ,

Por Jose Manuel Sanz Prieto

Desarrollador web. En este blog hablo de fotografía, programación con Django, Python, PHP y privacidad.

Dejar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *