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.

Recordad que si queréis estar al tanto de cuando suba el siguiente tutorial, seguidme en Twitter, ya que hay siempre informo de cuando subo nuevo material.

Nos leemos 👋

226 vistas

Nos tomamos en serio tu privacidad

Utilizamos cookies propias y de terceros para mejorar la experiencia del usuario a través de su navegación. Si pulsas entendido aceptas su uso. Ver política de cookies.

🐍 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!