Autenticación básica: Django REST Framework

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

Deja una respuesta

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