ваше сообщение коммита

This commit is contained in:
2025-04-21 21:35:15 +03:00
parent b933887cdd
commit 6787ecf9ba
6 changed files with 41 additions and 135 deletions

View File

@@ -37,23 +37,8 @@ app.use(
}) })
); );
// Настройка сессии // Настройка сессии (ИСПОЛЬЗУЕМ ИМПОРТИРОВАННОЕ MIDDLEWARE)
app.use( app.use(sessionMiddleware);
session({
store: sessionMiddleware.store,
secret: process.env.SESSION_SECRET || 'hb3atoken',
name: 'sessionId',
resave: false,
saveUninitialized: true,
cookie: {
maxAge: 30 * 24 * 60 * 60 * 1000,
httpOnly: true,
secure: false,
sameSite: 'lax',
path: '/',
},
})
);
// Добавим middleware для проверки сессии // Добавим middleware для проверки сессии
app.use(async (req, res, next) => { app.use(async (req, res, next) => {

View File

@@ -1,9 +1,10 @@
{ {
"verbose": true, "verbose": true,
"ignore": [".git", "node_modules/**/node_modules", "sessions", "data/vector_store"], "ignore": [".git", "node_modules/**/node_modules", "sessions", "data/vector_store", "logs"],
"watch": ["*.js", "routes/", "services/", "utils/", "middleware/"], "watch": ["*.js", "routes/**/*", "services/**/*", "utils/**/*", "middleware/**/*"],
"env": { "env": {
"NODE_ENV": "development" "NODE_ENV": "development"
}, },
"ext": "js,json,env" "ext": "js,json,env",
"exec": "node server.js"
} }

View File

@@ -431,15 +431,25 @@ router.post('/email/verify-code', async (req, res) => {
}); });
// Инициализация Telegram аутентификации // Инициализация Telegram аутентификации
router.post('/telegram/init', requireAuth, async (req, res) => { router.post('/telegram/init', async (req, res) => {
try { try {
const { userId } = req.session; // Инициализируем процесс аутентификации через Telegram, передавая сессию
// и получаем результат (код и ссылку на бота)
const result = await initTelegramAuth(req.session);
// Инициализируем процесс аутентификации через Telegram // Логируем сессию перед сохранением
await initTelegramAuth(userId); logger.info('[telegram/init] Session object before save:', req.session);
// Не возвращаем данные обратно, так как они отправляются ботом // Сохраняем сессию, чтобы guestId точно записался в базу данных
res.json({ success: true, message: 'Проверьте вашего Telegram бота' }); await sessionService.saveSession(req.session);
// Возвращаем код и ссылку на бота на фронтенд
res.json({
success: true,
message: 'Проверьте вашего Telegram бота',
verificationCode: result.verificationCode,
botLink: result.botLink,
});
} catch (error) { } catch (error) {
logger.error('Error initializing Telegram auth:', error); logger.error('Error initializing Telegram auth:', error);

View File

@@ -13,6 +13,9 @@ class SessionService {
*/ */
async saveSession(session) { async saveSession(session) {
try { try {
// Логируем содержимое сессии перед сохранением
logger.info('[SessionService] Saving session data:', session);
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
session.save((err) => { session.save((err) => {
if (err) { if (err) {

View File

@@ -134,8 +134,11 @@ async function getBot() {
} }
} }
// Логируем guestId перед обновлением сессии
logger.info(`[telegramBot] Attempting to update session for guestId: ${providerId}`);
// Обновляем сессию в базе данных // Обновляем сессию в базе данных
await db.query( const updateResult = await db.query(
`UPDATE session `UPDATE session
SET sess = (sess::jsonb || $1::jsonb)::json SET sess = (sess::jsonb || $1::jsonb)::json
WHERE sess::jsonb @> $2::jsonb`, WHERE sess::jsonb @> $2::jsonb`,
@@ -145,11 +148,23 @@ async function getBot() {
authenticated: true, authenticated: true,
authType: 'telegram', authType: 'telegram',
telegramId: ctx.from.id.toString(), telegramId: ctx.from.id.toString(),
// Добавляем имя и юзернейм из Telegram
telegramUsername: ctx.from.username,
telegramFirstName: ctx.from.first_name,
}), }),
JSON.stringify({ guestId: providerId }), JSON.stringify({ guestId: providerId }),
] ]
); );
// Логируем результат обновления сессии
if (updateResult.rowCount > 0) {
logger.info(`Session updated successfully for guestId: ${providerId}, userId: ${userId}`);
} else {
logger.warn(
`Session update failed: No session found or updated for guestId: ${providerId}. User ${userId} authenticated via Telegram, but web session might not reflect it.`
);
}
// Отправляем сообщение об успешной аутентификации // Отправляем сообщение об успешной аутентификации
await ctx.reply('Аутентификация успешна! Можете вернуться в приложение.'); await ctx.reply('Аутентификация успешна! Можете вернуться в приложение.');

View File

@@ -1,108 +0,0 @@
<template>
<div class="telegram-connect">
<div v-if="!showQR" class="intro">
<p>Подключите свой аккаунт Telegram для быстрой авторизации</p>
<button class="connect-button" :disabled="loading" @click="startConnection">
<span class="telegram-icon">📱</span>
{{ loading ? 'Загрузка...' : 'Подключить Telegram' }}
</button>
</div>
<div v-else class="qr-section">
<p>Отсканируйте QR-код в приложении Telegram</p>
<!-- eslint-disable-next-line vue/no-v-html -->
<div class="qr-container" v-html="qrCode" />
<p class="or-divider">или</p>
<a :href="botLink" target="_blank" class="bot-link"> Открыть бота в Telegram </a>
<button class="reset-button" @click="resetConnection">Отмена</button>
</div>
<div v-if="error" class="error">{{ error }}</div>
</div>
</template>
<script setup>
import { ref, onMounted, onUnmounted } from 'vue';
import axios from '@/api/axios';
import { useAuth } from '@/composables/useAuth';
import QRCode from 'qrcode';
const emit = defineEmits(['close']);
const { linkIdentity } = useAuth();
const loading = ref(false);
const error = ref('');
const showQR = ref(false);
const qrCode = ref('');
const botLink = ref('');
const pollInterval = ref(null);
const connectionToken = ref('');
const startConnection = async () => {
try {
loading.value = true;
error.value = '';
const response = await axios.post('/api/auth/telegram/start-connection');
if (response.data.success) {
connectionToken.value = response.data.token;
botLink.value = `https://t.me/${response.data.botUsername}?start=${connectionToken.value}`;
// Генерируем QR-код
const qr = await QRCode.toDataURL(botLink.value);
qrCode.value = `<img src="${qr}" alt="Telegram QR Code" />`;
showQR.value = true;
startPolling();
} else {
error.value = response.data.error || 'Не удалось начать процесс подключения';
}
} catch (err) {
error.value = err.response?.data?.error || 'Ошибка при подключении Telegram';
} finally {
loading.value = false;
}
};
const checkConnection = async () => {
try {
const response = await axios.post('/api/auth/telegram/check-connection', {
token: connectionToken.value,
});
if (response.data.success && response.data.telegramId) {
// Связываем Telegram с текущим пользователем
await linkIdentity('telegram', response.data.telegramId);
stopPolling();
emit('close');
}
} catch (error) {
console.error('Error checking connection:', error);
}
};
const startPolling = () => {
pollInterval.value = setInterval(checkConnection, 2000);
};
const stopPolling = () => {
if (pollInterval.value) {
clearInterval(pollInterval.value);
pollInterval.value = null;
}
};
const resetConnection = () => {
stopPolling();
showQR.value = false;
error.value = '';
qrCode.value = '';
botLink.value = '';
connectionToken.value = '';
};
onUnmounted(() => {
stopPolling();
});
</script>