Update files
This commit is contained in:
parent
541123c53d
commit
097b545cd7
|
|
@ -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-значный код
|
||||
|
|
|
|||
|
|
@ -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}с)`);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Reference in New Issue