Files
hotel777-manager/auth.js
2026-05-03 19:06:35 +05:00

57 lines
2.1 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
const session = require('express-session');
const SQLiteStore = require('connect-sqlite3')(session);
const bcrypt = require('bcrypt');
const { db } = require('./db');
const path = require('path');
// Директория для файла с сессиями (пусть будет data/)
const sessionDbPath = path.join(__dirname, 'data', 'sessions.sqlite');
const sessionMiddleware = session({
secret: process.env.SESSION_SECRET || 'hotel-secret-key-change-me',
resave: false,
saveUninitialized: false,
cookie: {
secure: false, // для HTTPS нужно true, но у нас http
httpOnly: true,
maxAge: 24 * 60 * 60 * 1000 // 24 часа
},
store: new SQLiteStore({
db: 'sessions.sqlite', // имя файла в директории data
dir: path.join(__dirname, 'data'),
table: 'sessions' // имя таблицы
})
});
/**
* Гарантирует существование администратора, заданного переменными окружения
* (ADMIN_LOGIN / ADMIN_PASSWORD). Пароль всегда хэшируется.
*/
async function ensureAdmin() {
const login = process.env.ADMIN_LOGIN || 'admin';
const password = process.env.ADMIN_PASSWORD || 'admin';
const saltRounds = 10;
const admin = db.prepare('SELECT id FROM admins WHERE login = ?').get(login);
const hashed = await bcrypt.hash(password, saltRounds);
if (admin) {
db.prepare('UPDATE admins SET password = ? WHERE login = ?').run(hashed, login);
console.log(`Пароль администратора "${login}" обновлён (хэширован)`);
} else {
db.prepare('INSERT INTO admins (login, password) VALUES (?, ?)').run(login, hashed);
console.log(`Администратор "${login}" создан (хэширован)`);
}
}
/**
* Middleware для проверки прав администратора.
*/
function requireAdmin(req, res, next) {
if (req.session && req.session.isAdmin) {
return next();
}
res.status(401).json({ error: 'Не авторизован' });
}
module.exports = { sessionMiddleware, ensureAdmin, requireAdmin };