- Клиентская часть Vue 3 + Vite - Серверная часть Node.js + WebSocket - Система авторизации и смен - Управление игровыми портами - Поддержка тем (светлая/темная) - Адаптивный дизайн 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
126 lines
5.6 KiB
JavaScript
126 lines
5.6 KiB
JavaScript
"use strict";
|
||
|
||
const fs = require('node:fs/promises');
|
||
const path = require('path');
|
||
|
||
exports.go = async (req, res, postData, urlParsed) => {
|
||
try {
|
||
console.log('[api/auth-dev] РАЗРАБОТЧЕСКАЯ авторизация:', postData);
|
||
|
||
// Проверяем, что данные переданы
|
||
if (!postData || !postData.phone) {
|
||
return res.end(JSON.stringify({
|
||
success: false,
|
||
error: "Не указан номер телефона"
|
||
}));
|
||
}
|
||
|
||
// Нормализуем номер телефона (убираем все кроме цифр)
|
||
const normalizedPhone = postData.phone.replace(/\D/g, '');
|
||
|
||
console.log('[api/auth-dev] РАЗРАБОТЧЕСКАЯ авторизация для телефона:', normalizedPhone);
|
||
|
||
// Читаем данные администраторов
|
||
let admins = {};
|
||
try {
|
||
const adminsData = await fs.readFile(path.join(__dirname, '../data/avt.ini'), 'utf8');
|
||
admins = JSON.parse(adminsData);
|
||
console.log('[api/auth-dev] Доступные пользователи:', Object.keys(admins).length);
|
||
} catch (error) {
|
||
console.error('[api/auth-dev] Ошибка чтения файла пользователей:', error);
|
||
return res.end(JSON.stringify({
|
||
success: false,
|
||
error: "Ошибка загрузки данных пользователей"
|
||
}));
|
||
}
|
||
|
||
// Ищем пользователя по номеру телефона
|
||
let foundUser = null;
|
||
for (const [phone, userData] of Object.entries(admins)) {
|
||
const userNormalizedPhone = phone.replace(/\D/g, '');
|
||
if (userNormalizedPhone === normalizedPhone) {
|
||
foundUser = userData;
|
||
break;
|
||
}
|
||
}
|
||
|
||
if (!foundUser) {
|
||
console.log('[api/auth-dev] Пользователь не найден');
|
||
return res.end(JSON.stringify({
|
||
success: false,
|
||
error: "Пользователь с таким номером телефона не найден"
|
||
}));
|
||
}
|
||
|
||
console.log('[api/auth-dev] РАЗРАБОТЧЕСКАЯ авторизация успешна для:', foundUser.fio || foundUser._id);
|
||
|
||
// Генерируем сессионный hash для WebSocket авторизации
|
||
let sessionHash = null;
|
||
try {
|
||
// Читаем текущие хэши
|
||
let hashData = {};
|
||
try {
|
||
const hashFileContent = await fs.readFile(path.join(__dirname, '../data/hash.ini'), 'utf8');
|
||
hashData = JSON.parse(hashFileContent);
|
||
} catch (error) {
|
||
console.log('[api/auth-dev] Создаем новый файл хэшей');
|
||
hashData = {};
|
||
}
|
||
|
||
// Генерируем новый хэш (упрощенная версия)
|
||
sessionHash = require('crypto').randomBytes(8).toString('hex');
|
||
hashData[normalizedPhone] = sessionHash;
|
||
|
||
// Сохраняем хэш
|
||
await fs.writeFile(path.join(__dirname, '../data/hash.ini'), JSON.stringify(hashData));
|
||
console.log('[api/auth-dev] Сгенерирован hash для WebSocket:', sessionHash);
|
||
} catch (error) {
|
||
console.warn('[api/auth-dev] Ошибка генерации hash:', error);
|
||
}
|
||
|
||
// Определяем роль пользователя
|
||
let userRole = 'operator';
|
||
if (foundUser.taccess) {
|
||
userRole = foundUser.taccess;
|
||
} else if (foundUser.access && foundUser.access.fullaccess) {
|
||
userRole = 'admin';
|
||
} else if (foundUser.groupz && foundUser.groupz.name) {
|
||
const groupName = foundUser.groupz.name.toLowerCase();
|
||
if (groupName.includes('программист') || groupName.includes('админ')) {
|
||
userRole = 'admin';
|
||
} else if (groupName.includes('оператор')) {
|
||
userRole = 'operators';
|
||
} else if (groupName.includes('техник')) {
|
||
userRole = 'technics';
|
||
}
|
||
}
|
||
|
||
// Возвращаем данные пользователя в формате React клиента
|
||
const response = {
|
||
success: true,
|
||
user: {
|
||
id: foundUser._id || foundUser.id || normalizedPhone,
|
||
name: foundUser.fio || foundUser.name || foundUser._id || 'Пользователь',
|
||
phone: normalizedPhone,
|
||
role: userRole,
|
||
isAuthenticated: true,
|
||
hash: sessionHash, // Hash для WebSocket авторизации
|
||
// Дополнительные данные из профиля
|
||
group: foundUser.groupz ? foundUser.groupz.name : null,
|
||
color: foundUser.color || null,
|
||
balance: foundUser.bal || null,
|
||
devAuth: true, // Флаг что это разработческая авторизация
|
||
serverConnected: global.conn_to_server
|
||
}
|
||
};
|
||
|
||
res.end(JSON.stringify(response));
|
||
|
||
} catch (error) {
|
||
console.error('[api/auth-dev] Критическая ошибка при авторизации:', error);
|
||
res.end(JSON.stringify({
|
||
success: false,
|
||
error: "Внутренняя ошибка сервера при авторизации"
|
||
}));
|
||
}
|
||
};
|