Mostrando entradas con la etiqueta Autenticaci贸n. Mostrar todas las entradas
Mostrando entradas con la etiqueta Autenticaci贸n. Mostrar todas las entradas

domingo, 3 de agosto de 2025

馃攼 Python Nivel 3 – Parte 5: Consumo de APIs con Autenticaci贸n (Tokens, Headers)

 

馃幆 ¿Qu茅 aprender谩s?

✅ C贸mo consumir APIs que requieren autenticaci贸n
✅ Diferencias entre APIs con tokens, headers o claves API
✅ Uso de tokens tipo JWT
✅ Ejemplo real con la API de CoinCap
✅ C贸mo automatizar consultas autenticadas


馃實 API real: CoinCap (criptomonedas)

馃敆 Documentaci贸n: https://docs.coincap.io/

Esta API ofrece cotizaciones de criptomonedas. Algunas rutas requieren autenticaci贸n con API Key v铆a encabezado.


馃摝 Paso 1: Instala requests


pip install requests

馃攼 Paso 2: Crea una cuenta y consigue tu API KEY

  1. Ve a https://coincap.io/

  2. Crea cuenta gratuita

  3. Copia tu clave API


馃搫 Paso 3: Realiza consulta autenticada


import requests # Tu API Key Pro API_KEY = "TU_API_KEY" # URL de CoinCap Pro v3 url = f"https://rest.coincap.io/v3/assets/bitcoin?apiKey={API_KEY}" try: respuesta = requests.get(url) if respuesta.status_code == 200: datos = respuesta.json() # La estructura cambia en v3: datos dentro de "data" precio = float(datos['data']['priceUsd']) print(f"El precio actual de Bitcoin es: ${precio:.2f}") else: print("Error al obtener los datos de Bitcoin") print(f"C贸digo de estado: {respuesta.status_code}") print(f"Mensaje de error: {respuesta.text}") except Exception as e: print("❌ Error de conexi贸n:", e)

馃攣 Automatizar la consulta

Puedes ejecutar el script cada hora o guardar el valor en un .txt para seguimiento:

import time
while True: r = requests.get(url, headers=headers) if r.ok: precio = r.json()["data"]["priceUsd"] print(f"[Auto] BTC: ${float(precio):,.2f}") time.sleep(3600) # cada hora

✅ ¿Y si la API usa JWT?

  • Algunas APIs env铆an un token JWT al hacer POST con usuario/clave.

  • Lo guardas y lo reutilizas en headers como:
    "Authorization": "Bearer TOKEN_JWT"

馃攼 Recomendaci贸n: Usa variables de entorno o ficheros .env para guardar tus claves, no las pongas directo en el c贸digo.


馃 Aplicaciones reales

✔️ Dashboards de precios en tiempo real
✔️ Integraci贸n con bots (Telegram, Discord, etc.)
✔️ Automatizaci贸n de alertas econ贸micas
✔️ Automatizaci贸n de reportes o backups usando datos externos


馃搨 C贸digo completo en GitHub:
github.com/josecodetech

馃帴 Gu铆a paso a paso en YouTube:
[Tu canal aqu铆]



martes, 25 de marzo de 2025

馃憠 Autenticaci贸n de APIs en Flask con JWT (JSON Web Tokens)

Despu茅s de implementar autenticaci贸n con sesiones en Flask, es momento de aprender una alternativa moderna y escalable: JWT (JSON Web Tokens). Ideal para APIs RESTful.

En este post aprender谩s:
✔️ Qu茅 es JWT y para qu茅 se usa
✔️ C贸mo generar y verificar tokens en Flask
✔️ Proteger rutas con decoradores
✔️ Ejemplo pr谩ctico paso a paso

馃搶 JWT es ampliamente usado en APIs modernas por su seguridad y portabilidad.


1️⃣ ¿Qu茅 es JWT?

JWT (JSON Web Token) es un est谩ndar para transmitir informaci贸n de forma segura entre dos partes.

馃搶 Se compone de 3 partes codificadas en base64:

  • Header (tipo y algoritmo)

  • Payload (datos del usuario)

  • Signature (clave secreta)

✅ Es 煤til para autenticar usuarios sin necesidad de sesiones.


2️⃣ Instalar dependencias

pip install flask flask_sqlalchemy pyjwt

Tambi茅n usaremos werkzeug.security para manejar contrase帽as:

from werkzeug.security import generate_password_hash, check_password_hash

3️⃣ Generar el token JWT al iniciar sesi贸n

import jwt from datetime import datetime, timedelta from flask import Flask, request, jsonify app = Flask(__name__) app.config["SECRET_KEY"] = "clave_super_segura" def generar_token(usuario_id): payload = { "usuario_id": usuario_id, "exp": datetime.utcnow() + timedelta(hours=1) } token = jwt.encode(payload, app.config["SECRET_KEY"], algorithm="HS256") return token

4️⃣ Ruta de Login para devolver un JWT

@app.route("/login", methods=["POST"]) def login(): datos = request.json usuario = Usuario.query.filter_by(email=datos["email"]).first() if usuario and check_password_hash(usuario.password, datos["password"]): token = generar_token(usuario.id) return jsonify({"token": token}) return jsonify({"error": "Credenciales inv谩lidas"}), 401

馃搶 Salida esperada:

{ "token": "eyJhbGciOiJIUzI1NiIsInR..." }

5️⃣ Proteger rutas con un decorador personalizado

from functools import wraps def token_requerido(f): @wraps(f) def decorador(*args, **kwargs): token = request.headers.get("Authorization") if not token: return jsonify({"error": "Token requerido"}), 403 try: datos = jwt.decode(token, app.config["SECRET_KEY"], algorithms=["HS256"]) usuario = Usuario.query.get(datos["usuario_id"]) except: return jsonify({"error": "Token inv谩lido o expirado"}), 403 return f(usuario, *args, **kwargs) return decorador

6️⃣ Ruta protegida usando el token

@app.route("/perfil") @token_requerido def perfil(usuario): return jsonify({ "usuario": usuario.username, "email": usuario.email })

✅ Si el token es v谩lido, se accede al perfil del usuario autenticado.


7️⃣ C贸mo enviar el token desde el cliente

馃搶 En las peticiones protegidas, se debe incluir el token:

GET /perfil HTTP/1.1 Authorization: eyJhbGciOiJIUzI1NiIsInR...

✅ Esto permite que el backend valide al usuario sin usar cookies ni sesiones.


馃殌 Conclusi贸n

✅ JWT es ideal para autenticar usuarios en APIs REST.
✅ Protege tus rutas con decoradores y claves secretas.
✅ A diferencia de Flask-Login, JWT es stateless, perfecto para microservicios.

馃搶 Pr贸ximo post: C贸mo refrescar tokens JWT y controlar expiraci贸n.

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

馃挰 ¿Ya usaste JWT? ¿Prefieres sesiones o tokens? Cu茅ntamelo 馃憞



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?