62 lines
2.1 KiB
JavaScript
62 lines
2.1 KiB
JavaScript
const bcrypt = require('bcryptjs');
|
|
|
|
class AuthService {
|
|
constructor() {
|
|
this.db = null;
|
|
}
|
|
|
|
setDatabase(database) {
|
|
this.db = database;
|
|
this.initUsers();
|
|
}
|
|
|
|
initUsers() {
|
|
if (!this.db) return;
|
|
const users = [
|
|
{
|
|
login: process.env.USER_1_LOGIN,
|
|
password: process.env.USER_1_PASSWORD,
|
|
name: process.env.USER_1_NAME,
|
|
email: process.env.USER_1_EMAIL,
|
|
role: process.env.USER_1_ROLE || 'admin'
|
|
}
|
|
];
|
|
for (const u of users) {
|
|
if (u.login && u.password) {
|
|
this.createUserIfNotExists(u);
|
|
}
|
|
}
|
|
}
|
|
|
|
async createUserIfNotExists(userData) {
|
|
const row = this.db.prepare('SELECT id FROM users WHERE login = ?').get(userData.login);
|
|
if (!row) {
|
|
const hashedPassword = await bcrypt.hash(userData.password, 10);
|
|
this.db.prepare(
|
|
'INSERT INTO users (login, password, name, email, role, auth_type, created_at) VALUES (?, ?, ?, ?, ?, ?, datetime(\'now\'))'
|
|
).run(userData.login, hashedPassword, userData.name, userData.email || null, userData.role, 'local');
|
|
console.log('Создан пользователь: ' + userData.name);
|
|
}
|
|
}
|
|
|
|
authenticate(login, password) {
|
|
const user = this.db.prepare("SELECT * FROM users WHERE login = ? AND auth_type = 'local'").get(login);
|
|
if (!user) return null;
|
|
const isValid = bcrypt.compareSync(password, user.password);
|
|
if (isValid) {
|
|
this.db.prepare("UPDATE users SET last_login = datetime('now') WHERE id = ?").run(user.id);
|
|
const { password, ...userWithoutPassword } = user;
|
|
return userWithoutPassword;
|
|
}
|
|
return null;
|
|
}
|
|
|
|
getUserById(id) {
|
|
const user = this.db.prepare('SELECT id, login, name, email, role, auth_type, created_at, last_login FROM users WHERE id = ?').get(id);
|
|
return user || null;
|
|
}
|
|
}
|
|
|
|
const authService = new AuthService();
|
|
module.exports = authService;
|