Saltar al contenido principal

Flujo de Login por QR

Flujo de autenticación mediante código QR usando Socket.IO.


⚠️ Endpoint Deprecated

Este flujo NO está activo actualmente en producción.
Se mantiene documentado solo como referencia para una posible reactivación futura.


🌐 Conexión WebSocket

Conexión Socket.IO

  • URL: ws://<HOST>/socket
  • Protocolo: Socket.IO
  • Comparte endpoint con el resto de la aplicación.

El frontend debe abrir la conexión antes de iniciar el flujo de QR.

const socket = io('ws://<HOST>/socket');

🔑 Unirse a la sala QR

join-qr-room

El cliente solicita unirse a una sala identificada por un qrToken previamente generado por el backend.

socket.emit('join-qr-room', {
qrToken: '<tokenRecibido>'
});

📡 Eventos de respuesta

joined

joined

Confirmación de unión exitosa a la sala QR.

socket.on('joined', () => {
// Mostrar spinner o estado "Esperando escaneo"
});

error

error

Fallo durante la unión o validación del QR.

Payload:

{
"code": 4006,
"message": "Token inválido o expirado"
}
socket.on('error', ({ code, message }) => {
// Mostrar alerta y detener el flujo
});

Códigos posibles:

  • 4006 – Token inválido o expirado
  • 4010 – IP no autorizada
  • 4012 – Intento duplicado (QR invalidado)

🔓 qr-approved

qr-approved

El usuario escaneó y aprobó el QR correctamente.

Payload:

{
"jwt": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}
socket.on('qr-approved', ({ jwt }) => {
// Guardar JWT y redirigir al área privada
});

🚫 qr-invalid

qr-invalid

El QR fue invalidado por intento duplicado.

socket.on('qr-invalid', ({ code, message }) => {
// Mostrar "QR inválido" y limpiar estado
});

qr-expired

qr-expired

El QR expiró sin ser aprobado por el usuario.

socket.on('qr-expired', ({ code, message }) => {
// Mostrar "QR expirado" y ofrecer reintentar
});

📝 Recomendaciones para el frontend

Buenas prácticas

  1. Manejar estados claros: esperando, aprobado, error, expirado
  2. Mostrar contador regresivo según TTL del QR
  3. No exponer IPs ni detalles internos en logs o UI
  4. Invalidar el estado local ante cualquier evento de error

📌 Estado actual

Estado del feature

  • 🚫 No activo actualmente
  • 🧾 Documentación conservada por compatibilidad y referencia
  • 🔮 Posible reactivación futura con cambios