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

En el post anterior, vimos como poder montar un sistema de login sencillo con JWT, de forma que al validar un usuario, el sistema nos devuelve un token que podemos usar para cualquier acción con el usuario.

Sin embargo JWT tiene un problema, que no eliminan los tokens, lo cual supone que aunque por definición el logout del usuario suponga el borrado del token para no poder usarlo, este sigue existiendo.

Para ello simplejwt nos aporta una función que permite crear listas negras de tokens que ya se han usado y evitar así que se puedan recuperar y usar de nuevo.

Configuración básica

Vamos, antes de nada a hacer un par de cambios en el fichero settings.py que nos permitirán gestionar esas blacklist de tokens.

Hacemos un par de modificaciones en el fichero settings.py:

INSTALLED_APPS = [
    ....
    # APLICACIONES DE TERCEROS
    'rest_framework',
    'rest_framework_simplejwt.token_blacklist',
    ....
]

Tras las migraciones oportunas, tenemos dos nuevas tablas en nuestra base de datos:

La tabla Outstanding tokens, recogerá los tokens de los usuarios que están actualmente logueados y Blacklisted tokens, recogerá los tokens de los usuarios que hayan desconectado de la plataforma y por tanto no se podrán volver a usar.

Como se ve en la imagen anterior, tenemos un usuario validado correctamente. Por tanto, en la tabla Outstanding tokens, se recogerá ese token:

Ahora que ya tenemos esto claro, vamos a crear una aplicación que nos permita gestionar a los usuarios y la llamaremos users

django-admin startapp users

Ahora crearemos una vista en el fichero views.py de users, que nos permita gestionar correctamente el logout

from rest_framework.permissions import IsAuthenticated
from rest_framework.views import APIView
from rest_framework_simplejwt.tokens import RefreshToken
from rest_framework.response import Response
from rest_framework import status

# Create your views here.

class LogoutView(APIView):
    permission_classes = (IsAuthenticated,)

    def post(self, request):
        try:
            refresh_token = request.data["refresh"]
            token = RefreshToken(refresh_token)
            token.blacklist()

            return Response(status=status.HTTP_205_RESET_CONTENT)
        except Exception as e:
            return Response(status=status.HTTP_400_BAD_REQUEST)

Creamos también el fichero urls.py de la aplicación users, que nos permitirá acceder a la url para el logout

from django.urls import path
from users.views import LogoutView


urlpatterns = [
    # URL PARA EL LOGOUT
    path('logout/', LogoutView.as_view(), name='logout_token'),
]

Y finalmente, importamos las ulrs a fichero urls.py principal para poder tener acceso a todo

from django.urls import path,include
...
urlpatterns = [
   ....
    path('users/', include('users.urls')),
   .... 
]

Ahora ya podemos probar nuestro sistema de login / logout completo en Postman, validandonos para obtener los tokens necesarios:

y usando el token access como validación Beader y como cuerpo de la llamada al logout, usamos el token refresh

De esta forma, obtenemos una respuesta 205 Reset Content, si se ha efectuado correctamente el logout.

Ahora podemos observar como en la tabla Blacklisted Token, aparece listado el token que hemos usado y que se ha dado de baja

De esta manera, hacemos que el usuario se desconecte de forma completa a través de la API y que el token no pueda ser usado de nuevo.

En un próximo post, volveremos sobre el tema del registro a través de la API y veremos como recuperar la información del usuario con el login, tal como vimos en la primera parte de esta serie de post.

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.

1 comentario

Dejar un comentario

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