Autenticación con Django REST Framework

Estándar

Esta es la última entrada acerca del motor de búsqueda de citas de los Simpson. En esta entrada, añadiremos autenticación, de modo que los usuarios de la API necesiten una cuenta de usuario. Esto cambiará ligeramente el protocolo de comunicación, ya que los usuarios deberán registrarse primero.


Al añadir autenticación, podemos controlar el acceso a la aplicación, además de otras cosas como a qué recursos puede acceder cada usuario, crear perfiles de usuario y sesiones. Con estos elementos podemos crear aplicaciones como chats, redes sociales o almacenes de datos personalizados. En todo caso, aquí sólo la usaremos para limitar el acceso al sistema.

Django y REST Framework proveen funciones para diversos métodos de autenticación, tales como la autenticación simple, OAuth, etc. Nosotros usaremos la autenticación por token, donde cada usuario recibe un token que lo identifica cada vez que se realiza una petición. Esto debe usarse siempre con HTTPS; y aunque en este ejemplo no lo usaremos, podemos encontrar la documentación aquí.


El primer paso será indicarle a REST Framework que use la autenticación por token y que proteja el acceso al API por defecto. Editamos el fichero SQProject/settings.py y buscamos la variable REST_FRAMEWORK. Cambiamos el valor de dicha variable al siguiente:

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.TokenAuthentication',
    ),
   'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',
    ),
}


A continuación, en el mismo fichero, añadimos la aplicación que permite a REST Framework manejar la autenticación. Buscamos la lista de aplicaciones instaladas en el proyecto:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'SQapp',
    'rest_framework',
    'rest_framework.authtoken'
]


Cada usuario tendrá un token asignado; no obstante, no es práctico usarlo como tal, ya que además, con cada sesión debe generarse un token nuevo. Por tanto, queremos identificar a los usuarios con un nombre y contraseña. REST Framework provee esta funcionalidad por defecto en la aplicación authtoken. Para obtener acceso a esta aplicación, debemos modificar SQProject/urls.py. Primero importamos la vista:

from rest_framework.authtoken.views import obtain_auth_token

y a continuación añadimos la URL a la lista:

url(r'^api-token-auth/', obtain_auth_token)


Actualizamos la base de datos:

python manage.py migrate
python manage.py makemigrations

Si intentamos accedear al API con cURL, veremos que falla con el siguiente mensaje:

{"detail":"Authentication credentials were not provided."}


El siguiente paso será crear los usuarios. Primero, crearemos un superusuario para acceder a la interfaz de administración de Django. Para ello, debemos ejecutar python manage.py createsuperuser.


Una vez creado, accedemos a http://localhost:8000/admin/.

Interfaz de administracion


Aquí podemos crear nuevos usuarios y sus respectivos tokens. En un sistema terminado, hace falta una vista concreta para crear los usuarios y un subsistema de sesiones que cree los tokens y administre el acceso a los elementos.


Con los usuarios y los tokens en el sistema, podemos pedirle el token al API con cURL:

curl -d "username=<usuario>&password=<contraseña>" localhost:8000/api-token-auth/ 

Nos devolverá una cadena JSON con el token:

{"token":"<codigo>"}


Con el token ya en mano, podemos usar de nuevo el API

curl -d "palabras=<terminos de busqueda>" localhost:8000/search/ -H 'Authorization: Token <codigo>'

Lo que hemos creado aquí es un buen punto de partida para el backbone de una aplicación basada en datos. Dicha aplicación podría tener varios tipos de cliente, adaptados a distintas plataformas (móvil, escritorio, web ...), que usarán los comandos que hemos usado con cURL. La mayoría de los lenguajes de programación disponen de librerías para esto. Por ejemplo, si accedemos desde una aplicación Android, podemos usar la librería Android Asynchronous Http Client, o XMLHttpRequest en una aplicación JavaScript. Por su parte, Python tiene la librería Requests.

Un punto adicional que hemos dejado fuera de esta serie sobre Django es el uso de servidores de producción. Siempre hemos usado el servidor de pruebas, que no es adecuado para un despliegue público. Debemos usar servidores como Apache o Nginx.

Se nos quedan muchas cosas sobre Django y REST Framework en el tintero. Algunas referencias interesantes son las páginas de Django y Django REST Framework. Reddit tiene un subreddit dedicado a Django, y por supuesto, cuando falla todo lo demás, siempre podemos acceder a Stack Overflow.

Deja una respuesta

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