@Snoz3f

Как передать Guard с одного модуля в другой в nest?

Приветствую, имеется вот такой код:

import { AuthGuard } from '@nestjs/passport';
import {
  ExecutionContext,
  Injectable,
  Logger,
  UnauthorizedException,
} from '@nestjs/common';
import { UsersService } from '../users/users.service';
import { ExtractJwt } from 'passport-jwt';

@Injectable()
export class JwtAuthGuard extends AuthGuard('jwt') {
  private logger = new Logger(JwtAuthGuard.name);
  constructor(
    private readonly usersService: UsersService,
  ) {
    super();
  }

  async canActivate(context: ExecutionContext): Promise<boolean> {
    const req = context.switchToHttp().getRequest();
    const res = context.switchToHttp().getResponse();

    try {
      const accessToken =
        req.cookies['accessToken'] ||
        ExtractJwt.fromAuthHeaderAsBearerToken()(req);

      if (!accessToken) {
        throw new UnauthorizedException('No access token provided');
      }
      const isAccessTokenValid = await this.usersService.validateToken(
        accessToken,
      );
      if (isAccessTokenValid) {
        return true;
      }
      const refreshToken = req.cookies['refreshToken'];
      if (!refreshToken) {
        throw new UnauthorizedException('No refresh token provided');
      }
      const isRefreshTokenValid = await this.usersService.validateToken(
        refreshToken,
      );
      if (!isRefreshTokenValid) {
        throw new UnauthorizedException('Invalid refresh token');
      }
      const user = await this.usersService.getByRefreshToken(refreshToken);
      if (!user) {
        throw new UnauthorizedException('User not found');
      }
      const payload = {
        username: user.username,
        sub: user._id,
        role: user.role,
      };
      const tokens = this.usersService.generateTokens(payload);
      req.cookies['accessToken'] = tokens.access_token;
      req.cookies['refreshToken'] = tokens.refresh_token;

      res.cookie('accessToken', tokens.access_token);
      res.cookie('refreshToken', tokens.refresh_token);

      return true;
    } catch (e) {
      this.logger.error(e);
      return false;
    }
  }
}


Но не могу понять как передать его в другие модули, при попытке его заюзать летят бесконечные ошибки, что надо импортировать сервисы, если их заимпортировать, то получается, что он не видит secretKey, после попробовал передать через singleton, то выдает следующую ошибку:
Error: Invalid guard passed to @UseGuards() decorator


Как это можно решить?
  • Вопрос задан
  • 69 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы