Proyecto API de películas con Django Rest Framework

Instalación de las dependencias

La autenticación con token es un sistema ideal para usar en webs asíncronas.

El token es un identificador único de la sesión de un usuario que sirve como credenciales de acceso a la API. Si el cliente envía este token en sus peticiones (que generaremos cuando se registra), ésta buscará si tiene los permisos necesarios para acceder a las acciones protegidas.

Desarrollar esta funcionalidad es tedioso, pero por suerte en DRF tenemos una serie de apps que nos harán la vida mucho más fácil, sólo tenemos que configurarlas adecuadamente y en pocos minutos tendremos un sistema de autenticación básico funcionando.

Esas apps son django-rest-auth para la autenticación y django-allauth para las cuentas de usuario:

pipenv install django-rest-auth==0.9.3
pipenv install django-allauth==0.38.0

Configurarlas conlleva añadir algunas apps y variables al settings y paths a las urls.

Primero la app django.contrib.sites que maneja los sites requeridos por nuestras dependencias:

api_pelis/settings.py

django.contrib.sites,

Luego rest_framework.authtoken para añadir la autenticación con tokens:

rest_framework.authtoken,

Dos más de django-rest-auth:

'rest_auth',
'rest_auth.registration',

Y otras tres para django-allauth:

'allauth',
'allauth.account',
'allauth.socialaccount',

Justo debajo de las apps pondremos las siguientes variables:

SITE_ID = 1

ACCOUNT_EMAIL_VERIFICATION = 'none'
ACCOUNT_AUTHENTICATION_METHOD = 'email'
ACCOUNT_EMAIL_REQUIRED = True
ACCOUNT_UNIQUE_EMAIL = True
ACCOUNT_USERNAME_REQUIRED = False

En resumen lo que hacemos es añadir la configuración del site actual, simplemente estableciendo un SITE_ID. Luego toda la parte que manejará la cuenta, que configuraremos sin verificación de email porque para esta pequeña API nos lo necesitamos, así como registro con email en lugar de usuario, algo que Django no permite hacer por defecto y la verdad es que es un puntazo.

Ahora añadiremos el backend de allauth a la configuración de Django, sin ello no nos funcionará nada.

AUTHENTICATION_BACKENDS = (
   "django.contrib.auth.backends.ModelBackend",
   "allauth.account.auth_backends.AuthenticationBackend"
)

Respecto a las URL añadiremos la parte de la autenticación y registro con rest_auth:

api_pelis/urls.py

path('api/v1/auth/', 
  include('rest_auth.urls')),
path('api/v1/auth/registration/', 
  include('rest_auth.registration.urls')),

Finalmente migramos de nuevo:

pipenv run migrate

Si lo hemos hecho todo correctamente, sin mucho problema podremos acceder a la url y registrar un usuario de prueba usando la interfaz web de DRF, de manera que justo después del registro veamos el token generado.

Por cierto, no es necesario poner un Username, sólo el Email y dos contraseñas iguales, eso sí, deben ser bastante seguras.

De la misma forma que registramos un usuario podemos conseguir el token haciendo login en la respectiva URL.