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:
- Configurar los métodos de autenticación en el archivo settings.py.
- Crear una vista de inicio de sesión.
- Crear clases de permisos para restringir las operaciones de usuarios específicos.
- Aplicar la clase de permiso en una vista utilizando el decorador 'permission_classes'.