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

View File

@ -3,6 +3,7 @@ const crypto = require('crypto');
const config = require('../config'); const config = require('../config');
const MAX_AUTH_AGE_SECONDS = 60 * 60; // 1 час const MAX_AUTH_AGE_SECONDS = 60 * 60; // 1 час
const AUTH_AGE_TOLERANCE_SECONDS = 300; // 5 минут допуск для синхронизации времени
/** /**
* Manual validation with base64 padding fix * Manual validation with base64 padding fix
@ -148,16 +149,25 @@ function validateAndParseInitData(initDataRaw, botToken = null) {
} }
const now = Math.floor(Date.now() / 1000); const now = Math.floor(Date.now() / 1000);
const age = Math.abs(now - authDate); const age = now - authDate; // Положительное значение = данные в прошлом
console.log('[Telegram] Auth date check:', { console.log('[Telegram] Auth date check:', {
authDate, authDate,
now, now,
age, age,
maxAge: MAX_AUTH_AGE_SECONDS, 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) { if (age > MAX_AUTH_AGE_SECONDS) {
throw new Error(`Данные авторизации устарели (возраст: ${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(); const result = await response.json();
console.log('[Telegram Widget] Результат авторизации:', result);
if (result.accessToken) { if (result.accessToken) {
localStorage.setItem('moderation_jwt_token', result.accessToken); localStorage.setItem('moderation_jwt_token', result.accessToken);
console.log('[Telegram Widget] Токен сохранен');
} }
if (result?.user) { if (result?.user) {
setUser(result.user); setUser(result.user);
setError(null); setError(null);
console.log('[Telegram Widget] Пользователь установлен:', result.user.username);
// Перенаправить на главную страницу после успешной авторизации
setTimeout(() => {
window.location.href = '/';
}, 500);
} else {
throw new Error('Пользователь не получен от сервера');
} }
} catch (err) { } catch (err) {
console.error('Ошибка авторизации через виджет:', err); console.error('Ошибка авторизации через виджет:', err);