viernes, 21 de marzo de 2025

馃憠 Autenticaci贸n de Usuarios en Flask con PostgreSQL y SQLAlchemy

En este post aprender谩s a crear un sistema de autenticaci贸n de usuarios en Flask usando PostgreSQL como base de datos.

Vamos a implementar:
✔️ Registro de nuevos usuarios
✔️ Login con verificaci贸n de credenciales
✔️ Hashing de contrase帽as con Werkzeug
✔️ Mantenimiento de sesi贸n con Flask
✔️ Ejemplo pr谩ctico con rutas protegidas

馃搶 Este es el primer paso para construir aplicaciones web seguras.


1️⃣ Instalar las dependencias necesarias

Aseg煤rate de tener Flask y PostgreSQL ya configurados. Luego, instala:

pip install flask flask_sqlalchemy psycopg2-binary flask_bcrypt flask_login

2️⃣ Configurar la app y la base de datos

from flask import Flask from flask_sqlalchemy import SQLAlchemy from flask_bcrypt import Bcrypt from flask_login import LoginManager app = Flask(__name__) app.config["SQLALCHEMY_DATABASE_URI"] = "postgresql://mi_usuario:mi_clave@localhost/mi_app" app.config["SECRET_KEY"] = "clave_secreta_super_segura" db = SQLAlchemy(app) bcrypt = Bcrypt(app) login_manager = LoginManager(app)

3️⃣ Modelo de Usuario con contrase帽a encriptada

from flask_login import UserMixin
class Usuario(db.Model, UserMixin): id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(50), unique=True, nullable=False) email = db.Column(db.String(120), unique=True, nullable=False) password = db.Column(db.String(128), nullable=False)

馃搶 Creamos la tabla con:

with app.app_context(): db.create_all()

4️⃣ Registro de nuevos usuarios con contrase帽a encriptada

from flask import request, jsonify @app.route("/registro", methods=["POST"]) def registro(): datos = request.json hashed_password = bcrypt.generate_password_hash(datos["password"]).decode("utf-8") nuevo_usuario = Usuario(username=datos["username"], email=datos["email"], password=hashed_password) db.session.add(nuevo_usuario) db.session.commit() return jsonify({"mensaje": "Usuario registrado con 茅xito"}), 201

馃搶 JSON esperado:

{ "username": "jose", "email": "jose@example.com", "password": "123456" }

5️⃣ Inicio de sesi贸n y validaci贸n de contrase帽a

from flask_login import login_user @app.route("/login", methods=["POST"]) def login(): datos = request.json usuario = Usuario.query.filter_by(email=datos["email"]).first() if usuario and bcrypt.check_password_hash(usuario.password, datos["password"]): login_user(usuario) return jsonify({"mensaje": "Login exitoso"}), 200 return jsonify({"error": "Credenciales incorrectas"}), 401

6️⃣ Rutas protegidas para usuarios logueados

from flask_login import login_required, current_user @app.route("/perfil") @login_required def perfil(): return jsonify({ "usuario": current_user.username, "email": current_user.email })

✅ Esta ruta solo puede ser accedida si el usuario est谩 autenticado.


7️⃣ Cerrar sesi贸n

from flask_login import logout_user @app.route("/logout") @login_required def logout(): logout_user() return jsonify({"mensaje": "Sesi贸n cerrada"})

馃殌 Conclusi贸n

✅ Hemos creado un sistema de registro, login y sesi贸n en Flask.
✅ Las contrase帽as se almacenan encriptadas con Bcrypt.
✅ Flask-Login facilita la autenticaci贸n y la protecci贸n de rutas.

馃搶 Pr贸ximo post: C贸mo integrar JWT para APIs seguras en Flask.

馃搨 C贸digo en GitHub: github.com/josecodetech
馃帴 Tutorial en YouTube: https://www.youtube.com/@josecodetech

馃挰 ¿Qu茅 tipo de autenticaci贸n sueles usar en tus proyectos Flask?



No hay comentarios:

Publicar un comentario

Se procedera a revision para su pronta publicacion en caso de que no incumpla las normas de blogger.