118 lines
3.3 KiB
JavaScript
118 lines
3.3 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
|
|
|
|
// Se não tem token, verifica se está tentando acessar uma página
|
|
if (!token) {
|
|
const isApiRoute = req.originalUrl.startsWith('/api');
|
|
const isLoginRoute = req.originalUrl.startsWith('/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 (req.originalUrl.startsWith('/api')) {
|
|
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,
|
|
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 = ?', ['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, NOW())`,
|
|
['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
|
|
};
|