Sistema Básico de Autenticación con Sesiones en Flask
Clase 14 de 18 • Curso de Flask
Resumen
La autenticación de usuarios es un componente fundamental en el desarrollo de aplicaciones web modernas. Implementar un sistema que proteja la información personal y garantice que solo usuarios autorizados accedan a determinados recursos es esencial para mantener la seguridad de cualquier plataforma. En este artículo, exploraremos cómo implementar un sistema básico de autenticación en Flask utilizando sesiones, un mecanismo que permite mantener información del usuario a través de diferentes solicitudes HTTP.
¿Cómo funcionan las sesiones en Flask?
Las sesiones en Flask nos permiten almacenar información específica del usuario en cookies del navegador. Esto es particularmente útil cuando necesitamos mantener el estado de autenticación de un usuario mientras navega por nuestra aplicación.
Las sesiones funcionan de la siguiente manera:
- Almacenan datos en cookies del navegador del cliente
- La información se encripta utilizando una clave secreta
- Permiten acceder a los datos del usuario en diferentes rutas de la aplicación
- Mantienen la persistencia de la información entre solicitudes HTTP
Es importante destacar que Flask implementa un mecanismo de seguridad mediante la secret_key
, que encripta la información almacenada en las cookies. Esto previene que, si alguien intercepta estas cookies, no pueda utilizarlas en otro navegador para suplantar la identidad del usuario original.
¿Por qué es importante la secret_key?
La secret_key
es un componente crítico en la seguridad de las sesiones de Flask. Esta clave se utiliza para:
- Encriptar la información almacenada en las cookies
- Prevenir ataques de suplantación de identidad
- Asegurar que las cookies solo funcionen en el navegador del usuario legítimo
- Proteger datos sensibles que se comparten entre el cliente y el servidor
Sin una secret_key
adecuada, cualquier persona con acceso a las cookies podría manipular la información y potencialmente acceder a recursos protegidos de la aplicación.
Implementando un sistema de autenticación básico
Para implementar nuestro sistema de autenticación, crearemos un nuevo Blueprint en Flask que manejará las rutas de login y logout. Este enfoque nos permite organizar mejor nuestro código y separar la lógica de autenticación del resto de la aplicación.
Creación del Blueprint de autenticación
Primero, debemos crear una nueva carpeta para nuestro Blueprint:
from flask import Blueprint
auth_bp = Blueprint('auth', __name__)
Luego, definimos la ruta de login que aceptará tanto solicitudes GET (para mostrar el formulario) como POST (para procesar la información del usuario):
from flask import Blueprint, request, render_template, redirect, url_for, flash, session
auth_bp = Blueprint('auth', __name__)
@auth_bp.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
username = request.form['username']
if username == 'admin':
session['user'] = username
return redirect(url_for('notes.home'))
else:
flash('Usuario no permitido', 'error')
return render_template('login.html')
En este código:
- Verificamos si la solicitud es POST (envío del formulario)
- Obtenemos el nombre de usuario del formulario
- Validamos si el usuario es válido (en este caso, solo 'admin')
- Si es válido, almacenamos el nombre de usuario en la sesión
- Redirigimos al usuario a la página principal de notas
- Si no es válido, mostramos un mensaje de error
Creación del template de login
Para que nuestro sistema funcione, necesitamos crear un template HTML que muestre el formulario de login:
{% extends 'base.html' %}
{% block content %}
<div class="container">
<h2>Login</h2>
<form method="POST">
<div class="form-group">
<label for="username">Username:</label>
<input type="text" name="username" id="username" required>
</div>
<button type="submit" class="btn">Login</button>
</form>
</div>
{% endblock %}
Registrando el Blueprint en la aplicación principal
Para que nuestro Blueprint funcione, debemos registrarlo en el archivo principal de la aplicación:
from auth.routes import auth_bp
app.register_blueprint(auth_bp)
¿Cómo utilizar la información de sesión en otras rutas?
Una vez que el usuario ha iniciado sesión, podemos acceder a la información almacenada en la sesión desde cualquier otra ruta de la aplicación. Esto nos permite:
- Verificar si el usuario está autenticado
- Mostrar contenido personalizado basado en el usuario
- Restringir el acceso a ciertas rutas solo para usuarios autenticados
- Filtrar información específica para cada usuario
Es importante recordar que no debemos almacenar grandes cantidades de información en la sesión. Lo ideal es guardar solo identificadores o datos pequeños que luego nos permitan recuperar información más completa desde nuestra base de datos.
Implementando el logout
Para completar nuestro sistema de autenticación, necesitamos una ruta que permita al usuario cerrar sesión. Esta ruta debe:
- Eliminar la información del usuario de la sesión
- Redirigir al usuario a la página de login
- Mostrar un mensaje confirmando que se ha cerrado sesión correctamente
@auth_bp.route('/logout')
def logout():
session.pop('user', None)
flash('Has cerrado sesión correctamente', 'success')
return redirect(url_for('auth.login'))
La implementación de un sistema de autenticación básico en Flask utilizando sesiones es un primer paso fundamental para proteger la información de los usuarios en nuestra aplicación. Aunque este ejemplo es simple, ilustra los conceptos clave que necesitas entender para desarrollar sistemas más complejos y seguros en el futuro. ¿Has implementado sistemas de autenticación en tus proyectos? Comparte tu experiencia en los comentarios.