diff --git a/backend/routes/moderationAuth.js b/backend/routes/moderationAuth.js index 9bb0246..f816cbe 100644 --- a/backend/routes/moderationAuth.js +++ b/backend/routes/moderationAuth.js @@ -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-значный код diff --git a/backend/utils/telegram.js b/backend/utils/telegram.js index d402fe0..15bf2bd 100644 --- a/backend/utils/telegram.js +++ b/backend/utils/telegram.js @@ -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}с)`); } diff --git a/moderation/frontend/src/App.jsx b/moderation/frontend/src/App.jsx index f453f66..0ab15c9 100644 --- a/moderation/frontend/src/App.jsx +++ b/moderation/frontend/src/App.jsx @@ -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);