logo cosasdedevs
Login con JWT en Django REST Framework

Login con JWT en Django REST Framework



My Profile
Jul 22, 2020

¡Hola! La semana pasada me tomé un descanso del blog después del super tutorial para aprender a crear una API con Django REST Framework pero esta semana ya vuelvo a la carga y esta vez seguiremos aprendiendo a implementar mejoras en una API con DRF.

Para el tutorial de hoy aprendemos a implementar la autenticación con JWT, pero antes de seguir vamos a explicar un poco que es JWT.

¿Qué es JWT?

JSON Web Token (JWT) es un estándar abierto (RFC-7519) basado en JSON para crear un token que sirva para enviar datos entre aplicaciones o servicios y garantizar que sean válidos y seguros.

Esta información puede ser verificada y es confiable porque está firmada digitalmente. Este tipo de tokens se pueden firmar usando un secreto (con el algoritmo HMAC) o un par de claves pública / privada usando RSA o ECDSA.

¿Cuál es la estructura de un JWT?

Se divide en tres partes separadas por puntos que son:

  • Header
  • Payload
  • Signature

Su formato se vería como algo así:

xxxxx.yyyyy.zzzzz

Header

El encabezado generalmente consta de dos partes: el tipo de token, que es JWT, y el algoritmo de firma que se utiliza, como HMAC SHA256 o RSA.

{
  "alg": "HS256",
  "typ": "JWT"
}

Después, este JSON será codificado en base64 como primera parte del token.

Payload

La segunda parte del token es el payload. Este contiene información sobre una entidad (generalmente datos del usuario) y datos adicionales. Hay tres tipos: registrados, públicos y privados.

{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true
}

Después, este JSON será codificado en base64 como segunda parte del token.

Signature

Por último, la firma del JWT se genera usando los anteriores dos campos codificados en base64 y una llave secreta (que solo conocerá el servidor al que enviaremos el JWT) para usar un algoritmo de encriptación.

En el debugger de la documentación de JWT podéis ver un ejemplo más claro de como se ve un token de este tipo.

Integrar JWT en Django REST Framework

Ahora que ya sabemos que es un JWT es hora de implementarlo en nuestro proyecto. Para este ejemplo voy a crearme una rama en el proyecto que realicé sobre como crear una API con DRF pero, ya que va a ser algo independiente, si ya tenéis conocimientos sobre esta librería no hace falta que veáis los otros tutoriales, si no os recomiendo que antes visitéis mi tutorial para crear una API completa con Django REST Framework.

Para este tutorial utilizaremos la librería djangorestframework_simplejwt así que lo primero que tenemos que hacer es instalarla:

pip install djangorestframework_simplejwt

Después iremos al archivo settings.py de nuestro proyecto y modificaremos la constante de configuración de DRF para utilizar la autenticación por JWT:

REST_FRAMEWORK = {
    ...
    'DEFAULT_AUTHENTICATION_CLASSES': (
        ...
        'rest_framework_simplejwt.authentication.JWTAuthentication',
    )
    ...
}

Por último abriremos el archivo urls.py para añadir las urls que necesitaremos para obtener el token y actualizarlo:

from rest_framework_simplejwt.views import (
    TokenObtainPairView,
    TokenRefreshView,
)

urlpatterns = [
    ...
    path('api/token/', TokenObtainPairView.as_view(), name='token_obtain_pair'),
    path('api/token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),
    ...
]

Y ya está listo, si queremos hacer modificaciones adicionales en la configuración como cambiar el ciclo de vida del token, utilizar otro tipo de algoritmo para la encriptación u otra llave secreta, os dejo la documentación de esta librería donde explica como cambiarlos.

Ahora que ya lo tenemos es hora de probarlo. Para ello voy a usar Postman; llamaremos a la url http://127.0.0.1:8000/api/token/ utilizando el método post y en mi caso enviando el email y el password en formato json aunque si no habéis configurado el proyecto para el login por email, deberéis enviar el username.

La API nos devolverá dos tokens, uno será el token de acceso y el otro lo utilizaremos para regenerar nuestro token cuando su ciclo de vida termine.

Para utilizarlo solamente necesitaremos llamar una url en nuestro proyecto que exija el permiso IsAuthenticated y pasar por las cabeceras nuestro token de autenticación y ya podremos acceder a nuestra API con un token JWT 🎉.

Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNTk1NDQwNjIxLCJqdGkiOiJmNzcyZGY5OGZkNmI0MjYyODhhNzFjMjBmYmVkYzFjOSIsInVzZXJfaWQiOjR9.cG3H4wEHjHwIGoiDvv-dBPWQ6hghqbmkUFFeoavAGRU

En este caso estamos accediendo a datos personales sobre la educación del usuario autenticado con nuestro token 💪.

Si queréis saber más acerca de como crear una API con Django REST Framework os aconsejo que miréis este tutorial donde explico paso a paso como crearla. 

También os dejo el enlace al proyecto en mi GitHub por si queréis echarle un vistazo.

Espero que este post te ayude y como siempre, te recomiendo seguirme en Twitter para estar al tanto de los nuevo contenido. Ahora también puedes seguirme en Instagram donde estoy subiendo tips, tutoriales en vídeo e información sobre herramientas para developers.

Por último os dejo mi guía para aprender a trabajar con APIs donde explico todo el funcionamiento de una API, el protocolo HTTP y veremos como construir una API con arquitectura REST.

Nos leemos 👋.

10101 vistas

🐍 Sígueme en Twitter

Si te gusta el contenido que subo y no quieres perderte nada, sígueme en Twitter y te avisaré cada vez que cree contenido nuevo 💪
Luego ¡Te sigo!

Nos tomamos en serio tu privacidad

Utilizamos cookies propias y de terceros para recopilar y analizar datos sobre la interacción de los usuarios con cosasdedevs.com. Ver política de cookies.