Files
rx.scoreodonto.com/dental-server/auth.js
T
VPS 4 Builder 5b0d80bf22
continuous-integration/webhook Deploy concluido (rx.scoreodonto.com)
feat: reestruturacao de menus na sidebar, niveis de acesso e migracao para postgresql/dragonflydb
2026-05-26 21:08:48 +02:00

122 lines
3.5 KiB
JavaScript

const jwt = require('jsonwebtoken');
const bcrypt = require('bcrypt');
const db = require('./database');
const JWT_SECRET = process.env.JWT_SECRET || 'sua-chave-secreta-alterar-em-producao';
const JWT_EXPIRES_IN = '7d';
// ================================================================
// MIDDLEWARE DE AUTENTICAÇÃO
// ================================================================
function authenticateToken(req, res, next) {
const authHeader = req.headers['authorization'];
const token = authHeader && authHeader.split(' ')[1]; // Bearer TOKEN
// Identifica se a rota é uma API (via URL ou cabeçalho Accept)
const isApiRoute = req.originalUrl.includes('/api') ||
(req.headers.accept && req.headers.accept.includes('application/json'));
// Se não tem token, verifica se está tentando acessar uma página
if (!token) {
const isLoginRoute = req.originalUrl.includes('/login') || req.originalUrl === '/auth/login.html';
if (isLoginRoute || req.originalUrl === '/status') {
return next();
}
if (isApiRoute) {
return res.status(401).json({ error: 'Token não fornecido' });
}
return res.redirect('/login');
}
// Verificar token
jwt.verify(token, JWT_SECRET, (err, user) => {
if (err) {
if (isApiRoute) {
return res.status(403).json({ error: 'Token inválido' });
}
return res.redirect('/login');
}
req.user = user;
next();
});
}
// ================================================================
// HASH DE SENHA
// ================================================================
async function hashPassword(password) {
const saltRounds = 10;
return await bcrypt.hash(password, saltRounds);
}
async function verifyPassword(password, hash) {
return await bcrypt.compare(password, hash);
}
// ================================================================
// GERAR TOKEN JWT
// ================================================================
function generateToken(user, expiresIn = JWT_EXPIRES_IN) {
return jwt.sign(
{
id: user.id,
username: user.username,
email: user.email,
is_admin: user.is_admin
},
JWT_SECRET,
{ expiresIn: expiresIn }
);
}
// ================================================================
// CRIAR USUÁRIO INICIAL
// ================================================================
async function createInitialUser() {
try {
// Verificar se usuário já existe
const existingUser = await db.get('SELECT * FROM users WHERE username = $1', ['rcesar']);
if (existingUser) {
console.log('👤 Usuário admin já existe:', existingUser.username);
return;
}
// Criar hash da senha
const passwordHash = await hashPassword('Rc362514');
// Inserir usuário
await db.run(
`INSERT INTO users (username, email, password_hash, is_admin, created_at)
VALUES ($1, $2, $3, true, CURRENT_TIMESTAMP) RETURNING id`,
['rcesar', 'rcesar@rcesar.com', passwordHash]
);
console.log('✅ Usuário admin criado: rcesar / Rc362514');
} catch (error) {
// Ignorar se tabela não existe ainda
if (error.message.includes('no such table')) {
console.log('⚠️ Tabela users não existe. Será criada pelo database.js');
} else {
console.error('❌ Erro ao criar usuário inicial:', error);
}
}
}
module.exports = {
authenticateToken,
hashPassword,
verifyPassword,
generateToken,
createInitialUser,
JWT_SECRET
};