4 usuarios conectados
Desarrollo web con Python. Autenticación y autorización
Desarrollo web con Python. Autenticación y autorización
Ahora vamos a abordar un aspecto crítico de la
seguridad en aplicaciones web: la autenticación y la
autorización. Estos dos conceptos están estrechamente relacionados pero
tienen propósitos distintos.
Autenticación: ¿Quién eres?
La autenticación es el proceso de
verificar la identidad de un usuario o un servicio. Su objetivo es confirmar que
alguien o algo es quien dice ser. En el contexto de una aplicación web, la
autenticación típicamente implica que un usuario proporcione credenciales (como
un nombre de usuario y una contraseña) para demostrar su identidad al sistema.
Procesos Comunes de Autenticación:
- Autenticación basada en Nombre de
Usuario y Contraseña: El método más tradicional, donde el usuario
ingresa sus credenciales y el servidor las verifica comparándolas con la
información almacenada (generalmente contraseñas hasheadas y saladas).
- Autenticación basada en Tokens (por
ejemplo, JWT - JSON Web Tokens): Después de una autenticación
exitosa (generalmente con nombre de usuario y contraseña), el servidor emite
un token que el cliente utiliza en las subsiguientes peticiones para
identificarse. El servidor puede verificar la validez del token sin
necesidad de volver a autenticar al usuario en cada petición.
- Autenticación basada en Sesiones:
Después de una autenticación exitosa, el servidor crea una sesión para el
usuario y le asigna un identificador único (ID de sesión), que se almacena
en una cookie en el navegador del usuario. En las peticiones posteriores, el
navegador envía la cookie con el ID de sesión, y el servidor utiliza este ID
para identificar al usuario y restaurar su estado de sesión.
- Autenticación de Terceros (OAuth
2.0, OpenID Connect): Permite a los usuarios autenticarse
utilizando cuentas de otros proveedores (por ejemplo, Google, Facebook,
Twitter). La aplicación delega la autenticación al proveedor de identidad y
recibe información verificada sobre el usuario.
- Autenticación Multifactor (MFA):
Requiere que los usuarios proporcionen múltiples formas de verificación (por
ejemplo, contraseña y un código enviado a su teléfono) para aumentar la
seguridad.
Autorización: ¿Qué permisos tienes?
La autorización es el proceso
de determinar qué acciones o recursos puede acceder un usuario autenticado. Una
vez que se ha verificado la identidad del usuario (autenticación), la
autorización decide si ese usuario tiene permiso para realizar una acción
específica o acceder a un recurso en particular.
Mecanismos Comunes de Autorización:
- Control de Acceso Basado en Roles
(RBAC - Role-Based Access Control): Se asignan roles a los usuarios
(por ejemplo, "administrador", "editor", "lector"), y a cada rol se le
asocian un conjunto de permisos. La autorización se basa en el rol del
usuario.
- Control de Acceso Basado en
Permisos (PBAC - Permission-Based Access Control): Se asignan
permisos específicos a los usuarios o grupos (por ejemplo,
"editar_artículos", "eliminar_usuarios"). La autorización se basa
directamente en estos permisos.
- Control de Acceso Basado en
Atributos (ABAC - Attribute-Based Access Control): La autorización
se basa en un conjunto de atributos del usuario, del recurso al que se
intenta acceder y del contexto de la solicitud (por ejemplo, la hora del
día, la ubicación).
- Listas de Control de Acceso (ACLs -
Access Control Lists): Se asocian listas de permisos con cada
recurso, especificando qué usuarios o grupos tienen qué tipos de acceso.
Implementación en Frameworks Web Python:
Los frameworks web Python proporcionan
herramientas y extensiones para implementar la autenticación y la autorización:
Flask:
- Flask-Login: Una extensión
popular que proporciona gestión de sesiones de usuario, inicio y cierre de
sesión, y la persistencia de la identidad del usuario a través de las
peticiones.
- Flask-Principal:
Proporciona abstracciones para la gestión de identidades y permisos,
facilitando la implementación de la autorización basada en roles o permisos.
- Se pueden implementar soluciones de
autenticación basadas en tokens (como JWT) utilizando bibliotecas como
PyJWT
.
- Para la autenticación de terceros, se pueden
utilizar bibliotecas como
Authlib
.
Django:
- Django tiene un sistema de autenticación y
autorización robusto e integrado (
django.contrib.auth
).
- Proporciona modelos para usuarios y grupos,
mecanismos para gestionar sesiones, hash de contraseñas seguro y vistas y
formularios preconstruidos para el inicio y cierre de sesión.
- El sistema de permisos de Django permite
definir permisos a nivel de modelo y asignarlos a usuarios y grupos.
- Se pueden crear sistemas de autorización
más complejos utilizando decoradores en las vistas (
@login_required
,
@permission_required
, @user_passes_test
) y el
sistema de plantillas.
- Para la autenticación basada en tokens, se
puede utilizar
django-rest-framework
(si se está construyendo
una API) o bibliotecas como djangorestframework-simplejwt
.
- Para la autenticación de terceros, se pueden
utilizar bibliotecas como
django-allauth
.
FastAPI:
- FastAPI facilita la implementación de varios
esquemas de seguridad utilizando dependencias.
- Soporta la autenticación basada en tokens (OAuth2
con esquemas como "password flow" y "bearer tokens") a través de
fastapi.security
.
- Se puede integrar con bibliotecas de gestión
de tokens JWT como
python-jose
.
- FastAPI también permite la implementación
de autenticación básica HTTP y autenticación con cookies.
- La autorización se puede implementar
utilizando dependencias que verifican los roles o permisos del usuario
autenticado antes de permitir el acceso a una ruta.
Ejemplo Conceptual (Flask):
Este ejemplo básico muestra cómo usar Flask-Login
para la autenticación y @login_required
para la autorización
(requiriendo que el usuario esté autenticado para acceder a la ruta /protected
).
La implementación adecuada de la autenticación
y la autorización es fundamental para la seguridad de cualquier aplicación web.
Es importante utilizar prácticas seguras (como el hash de contraseñas, la
protección contra ataques CSRF y la validación de tokens) y elegir las
herramientas adecuadas que proporciona tu framework web.