/
viktorphp
/
back-socket
Обзор
Документация
Войти
/
viktorphp
/
back-socket
Код
Запросы
0
Задачи
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/auth/ws-auth.guard.ts
55 строк
2 KB
Viktorphp84
release/D-25.001.00: fix receipt of sessionid
05 апр 2025, 23:47
05 апр 2025, 23:47
9f41b5b
Код
Авторство
О чём код?
import { CanActivate, ExecutionContext, Injectable } from '@nestjs/common'; import { WsException } from '@nestjs/websockets'; import { Socket } from 'socket.io'; import { UsersService } from '../services/users/users.service'; @Injectable() export class WsAuthGuard implements CanActivate { constructor(private usersService: UsersService) {} async canActivate(context: ExecutionContext): Promise<boolean> { try { const client: Socket = context.switchToWs().getClient(); const authUserCookies: string = client.handshake.auth.cookies; const decodedAuthUserCookies = decodeURIComponent(authUserCookies); const sessionId = decodedAuthUserCookies .split(',') .find((el) => el.includes('sessionId')) .split(':')[1] .replace(/["}]/g, ''); if (!sessionId) { throw new WsException('Идентификатор сессии не предоставлен'); } // Проверяем сессию пользователя const user = await this.usersService.getUserBySessionId(sessionId); if (!user) { throw new WsException('Сессия не найдена'); } // Проверяем срок действия сессии if ( user.sessionExpiresAt && new Date(user.sessionExpiresAt) < new Date() ) { throw new WsException('Сессия истекла'); } // Добавляем информацию о пользователе в объект client client.handshake.auth.userId = user.id; client.handshake.auth.userRole = user.role; return true; } catch (err) { if (err instanceof WsException) { throw err; } throw new WsException('Ошибка аутентификации'); } } }