Implement client authentication and admin clinics panel

This commit is contained in:
VPS 4 Builder
2026-05-26 04:17:12 +02:00
parent 13175f93aa
commit ec3f23c9ea
11 changed files with 2642 additions and 18 deletions
+24 -4
View File
@@ -17,6 +17,8 @@ const imageRoutes = require('./routes/images');
const patientsRouter = require('./routes/patients');
const gtosRouter = require('./routes/gtos');
const systemRoutes = require('./routes/system');
const adminClinicsRoutes = require('./routes/admin-clinics');
const { router: clientAuthRoutes, requireClientAuth } = require('./routes/client-auth');
const { checkInstallation } = require('./installer/check-installation');
const redis = require('./redis');
@@ -442,8 +444,14 @@ app.get('/reset', (req, res) => {
res.sendFile(path.join(__dirname, 'public', 'reset.html'));
});
// Página de Clínicas
app.get('/admin-clinics', (req, res) => {
res.sendFile(path.join(__dirname, 'public', 'admin-clinics.html'));
});
// Rotas de autenticação (públicas)
app.use('/api/auth', authRoutes);
app.use('/api/client', clientAuthRoutes);
// Página de login
app.get('/login', (req, res) => {
@@ -513,6 +521,10 @@ app.use('/api/gtos', gtosRouter);
app.use('/api/system', authenticateToken);
app.use('/api/system', systemRoutes);
// APIs Administrativas (Clínicas e Dispositivos) - requerem autenticação (checagem interna na rota)
app.use('/api/admin/clinics', authenticateToken);
app.use('/api/admin/clinics', adminClinicsRoutes);
// ================================================================
// SOCKET.IO - CONEXÕES EM TEMPO REAL
// ================================================================
@@ -529,17 +541,25 @@ io.use((socket, next) => {
return next(new Error('Authentication error: Token required'));
}
// 1. Verificar se é a API_KEY do Sensor
// 1. Verificar se é a API_KEY antiga/legado do Sensor
if (token === serverApiKey) {
socket.clientType = 'sensor';
return next(); // Token válido, prosseguir
}
// 2. Se não for a API_KEY, tentar validar como JWT (Painel Web)
// 2. Se não for a API_KEY, tentar validar como JWT (Painel Web ou Novo App Desktop)
try {
const user = jwt.verify(token, JWT_SECRET);
socket.clientType = 'web';
socket.user = user;
// Se o token for do tipo client_device (App Desktop Moderno), ele age como sensor
if (user.role === 'client_device') {
socket.clientType = 'sensor';
socket.user = user;
} else {
socket.clientType = 'web';
socket.user = user;
}
return next(); // JWT válido, prosseguir
} catch (error) {
console.log(`❌ Conexão Socket.IO rejeitada (Token Inválido) - IP: ${socket.handshake.address}`);