yarkov
@yarkov
Помог ответ? Отметь решением.

Как исправить JWTStrategy в Nest.js?

Есть проблема с JWT стратегией. Вот код:
import { Injectable, UnauthorizedException } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';
import { PassportStrategy } from '@nestjs/passport';
import { Strategy, ExtractJwt } from 'passport-jwt';
import { EnvironmentVariables } from '@/config/env-schema';
import { AuthService, JWTPayload } from '@/api/auth/auth.service';

@Injectable()
export class JWTStrategy extends PassportStrategy(Strategy, 'jwt') {
  constructor(
    private readonly configService: ConfigService<EnvironmentVariables>,
    // private readonly authService: AuthService,
  ) {
    super({
      jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
      ignoreExpiration: configService.get('APP_ENV') !== 'production',
      secretOrKey: configService.get('JWT_SECRET'),
    });
  }

  async validate(payload: JWTPayload) {
    console.log('validate(payload):', payload);
    // const user = await this.authService.getUserById(payload.id);

    // if (user === undefined) {
    //   throw new UnauthorizedException();
    // }

    return payload;
  }
}

Так всё работает. Но если раскомментировать строчки, чтобы сходить в БД, то в консоли ошибка:
Error: Unknown authentication strategy "jwt"

Хз что делать ))

Код auth.module.ts
import { Module } from '@nestjs/common';
import { JwtModule } from '@nestjs/jwt';
import { ConfigModule, ConfigService } from '@nestjs/config';
import { PassportModule } from '@nestjs/passport';
import { TypeOrmModule } from '@nestjs/typeorm';
import { getJWTConfig } from '@/config/jwt.config';
import { JWTStrategy } from '@/common/strategies';
import { UserEntity } from '@/api/user/user.entity';
import { UserService } from '@/api/user/user.service';
import { AuthService } from './auth.service';
import { AuthController } from './auth.controller';

@Module({
  imports: [
    TypeOrmModule.forFeature([UserEntity]),
    ConfigModule,
    PassportModule.register({
      defaultStrategy: 'jwt',
    }),
    JwtModule.registerAsync({
      imports: [ConfigModule],
      inject: [ConfigService],
      useFactory: getJWTConfig,
    }),
  ],
  providers: [AuthService, JWTStrategy, ConfigService, UserService],
  controllers: [AuthController],
  exports: [],
})
export class AuthModule {}
  • Вопрос задан
  • 1026 просмотров
Решения вопроса 1
yarkov
@yarkov Автор вопроса
Помог ответ? Отметь решением.
Как оказалось всё было на поверхности ))
Я использую пакет nestjs-i18n.
Было так:
@Injectable()
export class AuthService {
  constructor(
    @InjectRepository(UserEntity)
    private readonly userRepository: Repository<UserEntity>,
    private readonly jwtService: JwtService,
    private readonly configService: ConfigService<EnvironmentVariables>,
    private readonly userService: UserService,
    private readonly i18n: I18nRequestScopeService, // Проблема тут
  ) {}

А надо так:
@Injectable()
export class AuthService {
  constructor(
    @InjectRepository(UserEntity)
    private readonly userRepository: Repository<UserEntity>,
    private readonly jwtService: JwtService,
    private readonly configService: ConfigService<EnvironmentVariables>,
    private readonly userService: UserService,
    private readonly i18n: I18nService, // Меняем на I18nService и всё успешно работает ))
  ) {}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы