Привет! К сожалению, не предоставив конкретные детали об ошибке, сложно дать точный ответ на ваш вопрос. Однако, я могу предложить несколько общих рекомендаций по использованию JwtWSGuard с веб-сокетами в NestJS. 1. Убедитесь, что вы правильно настроили JWT-авторизацию в вашем приложении NestJS. Это включает в себя установку и настройку пакета `@nestjs/jwt`, создание токена и его верификацию при получении запроса. Убедитесь, что ваш гвард для JWT (`JwtGuard`) работает верно для ваших HTTP-маршрутов. 2. Проверьте, правильно ли настроен гвард для Websocket (`JwtWSGuard`). Убедитесь, что вы правильно прокидываете токен в запросе Websocket, чтобы он мог быть проверен и аутентифицирован. Это может потребовать настроек вашего клиента Websocket. 3. Проверьте, правильно ли вы перехватываете и обрабатываете ошибки. Вам может потребоваться добавить обработчик ошибок в ваш гвард, чтобы отлавливать и обрабатывать возможные ошибки аутентификации или проверки токена. 4. Убедитесь, что ваши HTTP- и Websocket-маршруты настроены правильно для использования гварда. Убедитесь, что вы добавили гвард к соответствующим маршрутам с помощью декораторов `UseGuards()` и `UseGuards(JwtWSGuard)`. Если вы сможете предоставить больше информации о своей проблеме или коде, связанном с гвардом для Websocket, я смогу дать более точный ответ и помочь вам решить проблему.
import { ExecutionContext } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';
export class WsAuthGuard extends AuthGuard('wsjwt') {
constructor() {
super();
}
getRequest(context: ExecutionContext) {
return context.switchToWs().getClient().handshake;
}
}
import { Injectable, UnauthorizedException } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';
import { PassportStrategy } from '@nestjs/passport';
import { ExtractJwt, Strategy } from 'passport-jwt';
@Injectable()
export class WsJwtStrategy extends PassportStrategy(Strategy, 'wsjwt') {
constructor(private readonly configService: ConfigService) {
super({
ignoreExpiration: false,
secretOrKey: configService.get('jwt.token.secret'),
jwtFromRequest: ExtractJwt.fromExtractors([
(request: Request) => {
const token = this.getTokenFromWebSocket(request.headers?.cookie);
return token;
},
]),
});
}
private getTokenFromWebSocket(cookie: string): string | null {
return this.getCookieValue(cookie, '_Secure-access-token');
}
private getCookieValue(cookieString: string, cookieName: string) {
const cookies = cookieString.split('; ');
for (const cookie of cookies) {
const [name, value] = cookie.split('=');
if (name === cookieName) {
return value;
}
}
return null;
}
async validate(payload: any) {
if (!payload) new UnauthorizedException();
return {
userId: payload.sub,
phone: payload.phone,
email: payload.email,
type: payload.type,
};
}
}