Update files

This commit is contained in:
glpshchn 2025-12-14 17:28:59 +03:00
parent 541123c53d
commit 097b545cd7
3 changed files with 36 additions and 11 deletions

View File

@ -47,16 +47,20 @@ router.post('/send-code', codeLimiter, async (req, res) => {
role: { $in: ['moderator', 'admin'] }
});
// Если пользователь существует, но уже зарегистрирован (есть passwordHash) - разрешить отправку кода
// (для восстановления пароля или повторной регистрации)
if (existingUser && existingUser.passwordHash) {
// Пользователь уже зарегистрирован - можно отправить код для восстановления
// (в будущем можно добавить отдельный endpoint для восстановления пароля)
} else if (!existingUser) {
console.log(`[ModerationAuth] Проверка пользователя для email ${emailLower}:`, {
found: !!existingUser,
hasPassword: existingUser?.passwordHash ? true : false,
role: existingUser?.role
});
// Если пользователь существует - разрешить отправку кода (независимо от наличия пароля)
if (existingUser) {
console.log(`[ModerationAuth] Пользователь найден, отправка кода разрешена`);
} else {
// Пользователя нет - проверить, может быть email установлен, но роль не установлена
// Или пользователь создан, но email не установлен правильно
const userByEmail = await User.findOne({ email: emailLower });
if (userByEmail && !['moderator', 'admin'].includes(userByEmail.role)) {
if (userByEmail) {
console.log(`[ModerationAuth] Пользователь найден, но роль не moderator/admin:`, userByEmail.role);
return res.status(403).json({
error: 'Регистрация недоступна. Обратитесь к администратору для получения доступа.'
});
@ -64,7 +68,7 @@ router.post('/send-code', codeLimiter, async (req, res) => {
// Если пользователя нет вообще - разрешить отправку кода
// (администратор должен создать пользователя заранее, но на случай если забыл - разрешаем)
console.log(`[ModerationAuth] Отправка кода на email без существующего пользователя: ${emailLower}`);
console.log(`[ModerationAuth] Пользователь не найден, но отправка кода разрешена для ${emailLower}`);
}
// Генерировать 6-значный код

View File

@ -3,6 +3,7 @@ const crypto = require('crypto');
const config = require('../config');
const MAX_AUTH_AGE_SECONDS = 60 * 60; // 1 час
const AUTH_AGE_TOLERANCE_SECONDS = 300; // 5 минут допуск для синхронизации времени
/**
* Manual validation with base64 padding fix
@ -148,16 +149,25 @@ function validateAndParseInitData(initDataRaw, botToken = null) {
}
const now = Math.floor(Date.now() / 1000);
const age = Math.abs(now - authDate);
const age = now - authDate; // Положительное значение = данные в прошлом
console.log('[Telegram] Auth date check:', {
authDate,
now,
age,
maxAge: MAX_AUTH_AGE_SECONDS,
expired: age > MAX_AUTH_AGE_SECONDS
tolerance: AUTH_AGE_TOLERANCE_SECONDS,
expired: age > MAX_AUTH_AGE_SECONDS,
futureData: age < -AUTH_AGE_TOLERANCE_SECONDS
});
// Проверка на данные из будущего (больше допуска) - возможна проблема с синхронизацией времени
if (age < -AUTH_AGE_TOLERANCE_SECONDS) {
console.warn('[Telegram] Auth date is in the future, possible clock skew:', age);
// Разрешаем, но логируем
}
// Проверка на устаревшие данные
if (age > MAX_AUTH_AGE_SECONDS) {
throw new Error(`Данные авторизации устарели (возраст: ${age}с, макс: ${MAX_AUTH_AGE_SECONDS}с)`);
}

View File

@ -262,13 +262,24 @@ export default function App() {
const result = await response.json();
console.log('[Telegram Widget] Результат авторизации:', result);
if (result.accessToken) {
localStorage.setItem('moderation_jwt_token', result.accessToken);
console.log('[Telegram Widget] Токен сохранен');
}
if (result?.user) {
setUser(result.user);
setError(null);
console.log('[Telegram Widget] Пользователь установлен:', result.user.username);
// Перенаправить на главную страницу после успешной авторизации
setTimeout(() => {
window.location.href = '/';
}, 500);
} else {
throw new Error('Пользователь не получен от сервера');
}
} catch (err) {
console.error('Ошибка авторизации через виджет:', err);