NestJs Passport jwt unknown strategy

Я пытаюсь реализовать стратегию JWT для аутентификации в моем приложении-гнезде.
Я получаю следующую ошибку

Неизвестная стратегия аутентификации "jwt"

Это мой код:
jwt.strategy.ts

import { Injectable } from "@nestjs/common";
import { PassportStrategy } from "@nestjs/passport";
import { Strategy } from "passport-local";
import { ExtractJwt } from "passport-jwt";
import { jwtConstants } from "./constants";

@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy) {
  constructor() {
    super({
      jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
      ignoreExpiration: false,
      secretOrKey: jwtConstants.secret,
    })
  }

  async validate(payload: any) {
    console.log(payload);
    return { userId: payload.sub, username: payload.username };
  }
}

Мой модуль аутентификации:
authentication.module.ts

import { Module } from '@nestjs/common';
import { AuthenticationService } from './authentication.service';
import { UsersModule } from 'src/users/users.module';
import { PassportModule } from '@nestjs/passport';
import { LocalStrategy } from './local.strategy';
import { JwtModule } from '@nestjs/jwt';
import { jwtConstants } from './constants';
import { JwtStrategy } from './jwt.strategy';

@Module({
  providers: [
    AuthenticationService,
    LocalStrategy,
    JwtStrategy
  ],
  imports: [
    UsersModule,
    PassportModule,
    JwtModule.register({
      secret: jwtConstants.secret,
      signOptions: { expiresIn: "1d" },
    })
  ],
  exports: [AuthenticationService]
})
export class AuthenticationModule {}

И я пытаюсь использовать его в следующем контроллере:
users.controller.ts

import { Controller, Post, Body, Put, Param, Get, UseGuards } from '@nestjs/common';
import { User } from './user.entity';
import { UsersService } from './users.service';
import { JwtAuthGuard } from 'src/authentication/jwt-auth.guard';

@Controller('users')
export class UsersController {
  constructor(private readonly usersService: UsersService) {}

  @UseGuards(JwtAuthGuard)
  @Get()
  async getAll(){
    return this.usersService.findAll();
  }
}

Модуль Users выглядит так:
users.module.ts

import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { User } from './user.entity';
import { UsersService } from './users.service';
import { UsersController } from './users.controller';

@Module({
  imports: [TypeOrmModule.forFeature([User])],
  providers: [UsersService],
  controllers: [UsersController],
  exports: [UsersService]
})
export class UsersModule {}

JwtAuthGuardэто просто класс, который расширяется от AuthGuard('jwt')Я следую руководству по аутентификации nestjs из официальных документов, но не могу запустить его в моем UsersModule

4 ответа

Решение

Проблема заключалась в том, что автоимпорт импортировал стратегию из неправильного пакета

import {Strategy} from "@nest/passport-local";

вместо того

import { Strategy } from "passport-jwt";

Для меня мне не хватало импорта JwtStrategy в providers

      @Module({
  controllers: [AuthController],
  imports: [
    PassportModule,
    JwtModule.register({
      secret: 'nomnom',
      signOptions: { expiresIn: '1d' },
    }),
  ],
  exports: [AuthService],
  providers: [AuthService, AccountService, LocalStrategy, JwtStrategy], // Here, make sure you have imported LocalStrategy and JwtStrategy.
})
export class AuthModule {}

Импортируйте свой модуль аутентификации в свой пользовательский модуль, тогда ваша пользовательская служба обнаружит его.

user.module.ts

import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { User } from './user.entity';
import { UsersService } from './users.service';
import { UsersController } from './users.controller';
// import authentication module here

@Module({
  imports: [
    AuthenticationModule, // add this here
    TypeOrmModule.forFeature([User])
  ],
  providers: [UsersService],
  controllers: [UsersController],
  exports: [UsersService]
})
export class UsersModule {}

authentication.module.ts

import { Module } from '@nestjs/common';
import { AuthenticationService } from './authentication.service';
import { UsersModule } from 'src/users/users.module';
import { PassportModule } from '@nestjs/passport';
import { LocalStrategy } from './local.strategy';
import { JwtModule } from '@nestjs/jwt';
import { jwtConstants } from './constants';
import { JwtStrategy } from './jwt.strategy';

@Module({
  providers: [
    AuthenticationService,
    LocalStrategy,
    JwtStrategy
  ],
  imports: [
    // UsersModule, # exclude this, your authentication module is not using it
    PassportModule,
    JwtModule.register({
      secret: jwtConstants.secret,
      signOptions: { expiresIn: "1d" },
    })
  ],
  exports: [
    JwtModule,
    PassportModule,
    AuthenticationService,

  ]
})
export class AuthenticationModule {}

Также я заметил, что вы импортировали UserModule внутри AuthenticationModule, но из вашего кода вы его нигде не используете. Так что удалите его, чтобы избежать круговой зависимости.

после нескольких раз получил ошибку 401 из-за этого неправильного автоимпорта

      import { Strategy } from "passport-local";

изменить эту строку на

      import { Strategy } from "passport-jwt";
Другие вопросы по тегам