La autenticación es un mecanismo que proporciona control de acceso basado en las credenciales asociadas con las requests entrantes. Django REST Framework proporciona varios esquemas de autenticación. En esta sección, veamos la Autenticación básica en el marco de descanso de Django, es decir, autenticado contra el nombre de usuario y la contraseña de un usuario.
La autenticación básica en Django REST Framework utiliza la autenticación básica HTTP. Por lo general, es apropiado para las pruebas. El marco REST intentará autenticar la clase de autenticación básica y establecerá los valores devueltos en request.user y request.auth. Si se autentica correctamente, BasicAuthentication proporciona las siguientes credenciales.
- request.user será una instancia de usuario de Django.
- request.auth será Ninguno.
de lo contrario, el valor de request.user se establecerá como una instancia de django.contrib.auth.models.AnonymousUser, y request.auth se establecerá en None. Para hacer el esquema de autenticación básica, debemos configurarlo en el esquema de autenticación predeterminado. Puede configurarlo globalmente o puede configurar el esquema de autenticación por vista.
Configuración del esquema de autenticación globalmente
Puede configurar la autenticación globalmente mediante la configuración DEFAULT_AUTHENTICATION_CLASSES.
Python3
REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': [ 'rest_framework.authentication.BasicAuthentication', ] }
Configuración del esquema de autenticación por vista
La configuración del esquema de autenticación por vista difiere en las vistas basadas en funciones y en las vistas basadas en clases.
Vistas basadas en funciones
Podemos utilizar los decoradores @authentication_classes y @permission_classes para establecer el esquema de autenticación en las vistas basadas en funciones que utilizan el decorador @api_view. El código de ejemplo es el siguiente:
Python3
@api_view(['GET']) @authentication_classes([BasicAuthentication]) @permission_classes([IsAuthenticated]) def function_based_view(request, format=None): content = { # `django.contrib.auth.User` instance 'user': str(request.user), # None 'auth': str(request.auth), } return Response(content)
Vistas basadas en clases
Al usar la clase APIView, podemos establecer el esquema de autenticación en vistas basadas en clases. El código de ejemplo es el siguiente:
Python3
from rest_framework.authentication import SessionAuthentication, BasicAuthentication from rest_framework.permissions import IsAuthenticated from rest_framework.response import Response from rest_framework.views import APIView class ClassBasedView(APIView): authentication_classes = [BasicAuthentication] permission_classes = [IsAuthenticated] def get(self, request, format=None): content = { # `django.contrib.auth.User` instance 'user': str(request.user), # None 'auth': str(request.auth), } return Response(content)
Nota: Aquí, usaremos el estilo de permiso más simple que permite el acceso a cualquier usuario autenticado y deniega el acceso a cualquier usuario no autenticado. Esto corresponde a la clase ‘IsAuthenticated’ en el marco REST. Si no se establece en la clase ‘IsAuthenticated’, utiliza la clase predeterminada ‘AllowAny’, que permite el acceso sin restricciones.
Incluida la autenticación básica para el servicio web Restful
Configuremos el esquema de autenticación básica globalmente. Puede abrir el archivo settings.py de nuestro servicio web tranquilo y agregar el siguiente código.
Python3
REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES'🙁 'rest_framework.authentication.BasicAuthentication', ) }
Nota: Puede consultar la sección API navegable para modelos, serializadores y vistas del proyecto utilizados en el artículo
Aquí configuramos el esquema de autenticación básica globalmente, por lo que no necesitamos configurarlo para cada vista. Pero necesitamos configurar la clase de permiso ya que, de manera predeterminada, la clase de permiso está configurada en AllowAny, lo que permite el acceso sin restricciones. Para utilizar la clase IsAuthenticated, debemos importarla desde rest_framework.permissions.
from rest_framework.permissions import IsAuthenticated
Ahora, establezcamos la clase de permiso en ‘IsAuthenticated’ para la clase RobotDetail y RobotList. El código es el siguiente:
Python3
class RobotDetail(generics.RetrieveUpdateDestroyAPIView): permission_classes = [IsAuthenticated] queryset = Robot.objects.all() serializer_class = RobotSerializer name = 'robot-detail' class RobotList(generics.ListCreateAPIView): permission_classes = [IsAuthenticated] queryset = Robot.objects.all() serializer_class = RobotSerializer name = 'robot-list'
Intentemos recuperar robots sin proporcionar ninguna credencial. El comando HTTPie es
http :8000/robot/
Producción
Ahora crearemos un superusuario y proporcionaremos las credenciales para recuperar robots. Puedes seguir ¿Cómo crear un superusuario en Django? para crear un superusuario.
Probemos el comando HTTPie con credenciales para recuperar los robots.
http -a “admin”:”admin@123″ :8000/robot/
Producción
Probemos un comando HTTPie que crea una nueva entrada de robot.
http -a “admin”:”admin@123″ POST :8000/robot/ name=”SR-3iA” robot_category=”SCARA Robots” currency=”USD” price=25000 manufacturer=”Fanuc” manufacturing_date=”2020-05 -10 00:00:00+00:00″
Producción
Nota: Si usa BasicAuthentication en producción, debe asegurarse de que su API esté disponible solo para HTTPS y siempre vuelva a solicitar las credenciales. Si está implementando en Apache usando mod_wsgi, debe configurar explícitamente mod_wsgi para pasar los encabezados requeridos a través de la aplicación configurando WSGIPassAuthorization en ‘On’.
Publicación traducida automáticamente
Artículo escrito por SonuGeorge y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA