ваше сообщение коммита
This commit is contained in:
@@ -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) => {
|
||||||
|
|||||||
@@ -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"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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('Аутентификация успешна! Можете вернуться в приложение.');
|
||||||
|
|
||||||
|
|||||||
@@ -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>
|
|
||||||
Reference in New Issue
Block a user