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 expirado4010– IP no autorizada4012– 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
- Manejar estados claros: esperando, aprobado, error, expirado
- Mostrar contador regresivo según TTL del QR
- No exponer IPs ni detalles internos en logs o UI
- 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