Autenticación y Autorización en Django Rest Framework

La autenticación y autorización son dos conceptos fundamentales en cualquier sistema de software que involucre usuarios y datos sensibles. En Django Rest Framework, podemos utilizar varias opciones para autenticar a los usuarios y autorizarlos para acceder a diferentes recursos.

Autenticación

La autenticación verifica la identidad del usuario, asegurándose de que la persona que intenta acceder al sistema es quien dice ser. Django Rest ofrece varios esquemas de autenticación, como Token, Basic, Session, etc. El esquema de autenticación a elegir dependerá de las necesidades del proyecto.

Autorización

Por otro lado, la autorización se encarga de limitar el acceso a ciertos recursos o acciones. Es decir, después de autenticar al usuario, la autorización verifica si éste tiene permiso para realizar una determinada acción o acceder a un recurso en particular. En Django Rest, la autorización se controla a través de permisos, que se pueden configurar en las vistas y clases de vistas.

Resumen

En resumen, la autenticación y autorización son aspectos importantes a considerar al desarrollar una API con Django Rest Framework. Dependerá del proyecto elegir qué tipo de autenticación es la más adecuada y definir los permisos de autorización que limiten el acceso a recursos y acciones relevantes para el sistema.

Autenticación y Autorización en Django Rest Framework (DRF)

La autenticación y autorización en Django Rest Framework (DRF) es un proceso importante que garantiza la seguridad del sistema al asegurarse de que solo los usuarios autorizados pueden acceder a los recursos protegidos.

Autenticación

Autenticación se refiere al proceso de verificar la identidad del usuario que hace una solicitud y asegurándose de que es quien dice ser. DRF proporciona varios métodos de autenticación integrados, entre ellos:

  • Basic Authentication: Este método de autenticación es uno de los más simples para autenticar usuarios de API. Básicamente, el usuario envía sus credenciales (nombre de usuario y contraseña) en la cabecera Authorization de la solicitud HTTP encriptada en Base64.
  • Token Authentication: Este método de autenticación se utiliza cuando se quiere autorizar a los usuarios que se autentiquen solo una vez. Se genera un token para cada usuario válido que se autentique correctamente y este token se utiliza durante el tiempo que se necesite.
  • JWT Authentication: Este método utiliza JSON Web Tokens (JWTs) como tokens autenticados que permiten al cliente autenticado acceder a los recursos del servidor. Es más seguro y escalable que el método token.

Autorización

La autorización se refiere a la forma en que se restringen los recursos que un usuario autenticado puede acceder. En DRF, hay dos formas de implementar la autorización:

  • A nivel de objeto: También conocida como "autorización de objeto", se utiliza para restringir el acceso a un objeto específico en una instancia de modelo. En las clases ViewSet, se define permission_classes para permitir o denegar el acceso.
  • A nivel de vista: En este caso, se incluyen directivas como IsAuthenticated para decir si un usuario tiene acceso a toda la vista o no.

Resumen

En resumen, la autenticación y autorización en Django Rest Framework son un proceso importante para garantizar la seguridad de una API. La autenticación asegura que un usuario es quien dice ser, mientras que la autorización especifica la lógica para restringir los recursos que un usuario autenticado puede acceder.

La autenticación y autorización son dos temas fundamentales en cualquier proyecto web, especialmente cuando se maneja información sensible.

A continuación, te daré un ejemplo práctico de cómo implementar autenticación y autorización en Django Rest. Supongamos que estamos desarrollando una API para una aplicación bancaria que permita a los usuarios realizar transferencias de dinero. En esta API, es necesario que los usuarios estén autenticados y autorizados para realizar estas operaciones.

1. Configurar los métodos de autenticación

Añadir la aplicación 'rest_framework' a nuestras aplicaciones de Django.

# settings.py
INSTALLED_APPS = [
    ...
    'rest_framework',
    ...
]

Ahora podemos configurar los métodos de autenticación que queremos usar en nuestra API. Django Rest Framework incluye varios métodos de autenticación preconstruidos, como TokenAuthentication, SessionAuthentication, BasicAuthentication y JSONWebTokenAuthentication. En este caso, usaremos TokenAuthentication, que utiliza tokens generados por el sistema de autenticación de Django.

# settings.py
REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.TokenAuthentication',
    ],
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.IsAuthenticated',
    ],
}

2. Crear una vista de inicio de sesión

Django Rest Framework incluye una vista predeterminada para la autenticación de Token.

# views.py
from rest_framework.authtoken.views import ObtainAuthToken
from rest_framework.authtoken.models import Token
from rest_framework.response import Response

class CustomAuthToken(ObtainAuthToken):
    def post(self, request, *args, **kwargs):
        serializer = self.serializer_class(data=request.data, context={'request': request})
        serializer.is_valid(raise_exception=True)
        user = serializer.validated_data['user']
        token, created = Token.objects.get_or_create(user=user)
        return Response({
            'token': token.key,
            'user_id': user.pk,
            'username': user.username
        })

Registrar la vista de inicio de sesión en nuestras URLs.

# urls.py
from django.urls import path
from .views import CustomAuthToken

urlpatterns = [
    path('login/', CustomAuthToken.as_view())
]

3. Crear clases de permisos

Podemos crear una clase de permiso que sólo permita a los usuarios realizar una transferencia si tienen suficiente saldo en su cuenta.

# permissions.py
from rest_framework.permissions import BasePermission

class HasEnoughBalance(BasePermission):
    def has_permission(self, request, view):
        return request.user.balance >= view.get_object().amount

4. Aplicar la clase de permiso en una vista

Podemos aplicar esta clase de permiso en una vista utilizando el decorador 'permission_classes'.

# views.py
from rest_framework.decorators import permission_classes
from rest_framework.generics import RetrieveUpdateDestroyAPIView
from rest_framework.permissions import IsAuthenticated
from .models import Transfer
from .serializers import TransferSerializer
from .permissions import HasEnoughBalance

@permission_classes([IsAuthenticated, HasEnoughBalance])
class TransferDetail(RetrieveUpdateDestroyAPIView):
    serializer_class = TransferSerializer
    queryset = Transfer.objects.all()

En resumen, podemos implementar autenticación y autorización en Django Rest Framework de la siguiente manera:

  1. Configurar los métodos de autenticación en el archivo settings.py.
  2. Crear una vista de inicio de sesión.
  3. Crear clases de permisos para restringir las operaciones de usuarios específicos.
  4. Aplicar la clase de permiso en una vista utilizando el decorador 'permission_classes'.

Un ejemplo práctico de autenticación y autorización en Django Rest:

Primero, hay que asegurarse de tener instaladas las siguientes dependencias en Django:

pip install djangorestframework
pip install django-rest-auth
pip install django-allauth

Luego, en el archivo settings.py de tu proyecto Django, agrega lo siguiente:

INSTALLED_APPS = [
    ...
    'rest_framework',
    'rest_framework.authtoken',
    'django.contrib.sites',
    'allauth',
    'allauth.account',
    'rest_auth.registration',
    ...
]

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.TokenAuthentication',
        'rest_framework.authentication.SessionAuthentication',
    ),
}

# Configurar el correo electrónico de confirmación de cuenta
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
SITE_ID = 1

En el archivo urls.py, agrega las urls necesarias para autenticación y autorización:

urlpatterns = [
    ...
    path('api-auth/', include('rest_framework.urls')),
    path('rest-auth/', include('rest_auth.urls')),
    path('rest-auth/registration/', include('rest_auth.registration.urls')),
    path('account/', include('allauth.urls')),
    ...
]

En este ejemplo, se está utilizando autenticación por token. Sin embargo, si deseas utilizar autenticación por sesión, simplemente omite la línea que contiene rest_framework.authentication.TokenAuthentication y asegurate de tener la sesión habilitada en Django.

Por último, para proteger tus vistas Django Rest, debes decorarlas con @api_view(['GET', 'POST']) y @authentication_classes([TokenAuthentication, SessionAuthentication]) como se muestra en el siguiente ejemplo:

from rest_framework.decorators import api_view, authentication_classes, permission_classes
from rest_framework.permissions import IsAuthenticated
from rest_framework.authentication import TokenAuthentication, SessionAuthentication

@api_view(['GET', 'POST'])
@authentication_classes([TokenAuthentication, SessionAuthentication])
@permission_classes([IsAuthenticated])
def mi_vista_protegida(request):
    # Aquí va el código que quieres proteger ...

Si se intenta acceder a la vista mi_vista_protegida sin estar autenticado, el usuario recibirá un error 401 (No autorizado). Si está autenticado, podrá acceder a la vista sin problemas.