Skip to content

fix(mt5-api): resolver 5 problemas críticos de auth, sesiones y deps#19

Open
victalejo wants to merge 2 commits into
slowfound:mainfrom
victalejo:main
Open

fix(mt5-api): resolver 5 problemas críticos de auth, sesiones y deps#19
victalejo wants to merge 2 commits into
slowfound:mainfrom
victalejo:main

Conversation

@victalejo
Copy link
Copy Markdown

Summary

Corrige 5 problemas críticos detectados en el sistema de autenticación
MT5 y el setup de dependencias:

  • Multi-usuario roto: /logout llamaba a mt5.shutdown(), lo que
    desconectaba el terminal MT5 para todos los usuarios concurrentes,
    no solo el que cerraba sesión. Además, no había guardia contra logins
    simultáneos con cuentas distintas (el MetaTrader5 singleton del
    proceso solo puede hospedar una cuenta a la vez).
  • Sesiones volátiles en memoria: SESSIONS = {} se perdía en cada
    restart de Flask y no era compatible con más de 1 worker de gunicorn.
  • SECRET_KEY con fallback inseguro: el código aceptaba arrancar
    con 'your-super-secret-key-change-in-production' si la variable no
    estaba seteada, permitiendo firmar/verificar JWTs con una clave pública.
  • backend/django/requirements.txt en UTF-16 LE: pip install -r
    fallaba en muchos entornos al no detectar la codificación.
  • JWT y expiración con datetime.now() naive: tokens y TTLs
    dependían de la TZ local del contenedor.

Cambios

  • routes/auth.py — sesiones movidas a Redis (DB 1) con TTL gestionado
    por la propia Redis vía SETEX/EXPIRE. Nueva clave mt5:current_login
    para marcar qué login "posee" el terminal en cada momento. El /login
    rechaza con 409 Conflict si ya hay otra cuenta activa, salvo que se
    pase "force": true. El /logout ya no llama a mt5.shutdown():
    solo borra la sesión y libera el marcador current_login si era suyo.
    Todas las marcas temporales pasan a datetime.now(timezone.utc).
  • app.py — valida SECRET_KEY al arrancar; lanza RuntimeError
    con instrucciones si falta o es un placeholder conocido. Inicializa
    el store de sesiones vía init_session_store(REDIS_URL).
  • backend/mt5/app/requirements.txt — añade redis==5.2.0.
  • backend/django/requirements.txt — re-codificado a UTF-8; se
    añade PyJWT==2.8.0 (lo importaba mt5_client.py pero faltaba).
  • docker-compose.ymlmt5 ahora declara depends_on: redis.
  • .env.exampleSECRET_KEY documentada como obligatoria con
    comando de generación; se añade REDIS_URL=redis://redis:6379/1.

…lity

- Added URL configuration for the Django app.
- Created MT5 login form and associated views for handling login and logout.
- Implemented middleware to protect routes requiring MT5 authentication.
- Developed dashboard view to display account information and open positions.
- Created templates for login and dashboard pages with Bootstrap styling.
- Established MT5 client API for robust interaction with the MT5 server.
- Updated Dockerfile for the MT5 service to use Debian Bookworm and optimize package installations.
- Introduced JWT-based authentication for the Flask MT5 API with session management.
- Secured API routes with authentication middleware and updated Swagger documentation.
- Adjusted docker-compose configuration for service port mapping.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant