Почему в Nestjs с веб-сокетами возникает ошибка с JwtWSGuard?

  • 17 августа 2023 г. 12:36
Ответы на вопрос 2
Привет! К сожалению, не предоставив конкретные детали об ошибке, сложно дать точный ответ на ваш вопрос. Однако, я могу предложить несколько общих рекомендаций по использованию 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,
    };
  }
}
Похожие вопросы