NestJs Passport jwt 未知策略

Posted

技术标签:

【中文标题】NestJs Passport jwt 未知策略【英文标题】:NestJs Passport jwt unknown strategy 【发布时间】:2020-06-09 19:37:59 【问题描述】:

我正在尝试在我的嵌套应用程序中实施 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.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 中运行

【问题讨论】:

您是否在 UserModule 中导入了AuthenticationModule?请务必在 AuthenticationModule 的导出中导出 PassportModuleJwtModule 【参考方案1】:

问题是自动导入从错误的包中导入的策略

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

而不是

import  Strategy  from "passport-jwt";

【讨论】:

【参考方案2】:

在您的用户模块中导入您的身份验证模块,然后您的用户服务将检测到它。

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 

我还注意到您在 AuthenticationModule 中导入了 UserModule,但是从您的代码中您没有在任何地方使用它。所以请删除它以避免循环依赖。

【讨论】:

我正在使用由 UserModule 提供的 UserService,所以我需要在我的 AuthModule 中使用它。我不需要在我的 UserModule 中导入 AuthModule。所以没有循环依赖。这是一个自动导入问题。 你的回答对我很有帮助,是的,不需要从 AuthModule 的依赖项中删除 UserModule 的最后一步,因为如果这样做,Nest 将无法使用 userService i authservice 确保您已将策略导入您的提供商的前任:providers: [ AuthenticationService, LocalStrategy, JwtStrategy ],【参考方案3】:

对我来说,我错过了将 JwtStrategy 导入 auth.module.ts 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 

【讨论】:

以上是关于NestJs Passport jwt 未知策略的主要内容,如果未能解决你的问题,请参考以下文章

使用passport-jwt在nestJs框架中进行角色验证

我在我的 nestJS 应用程序(使用 authGuard)中使用了 passport-jwt 身份验证策略,如何访问我的控制器中的令牌有效负载?

NestJS:使用 graphql 的 Passport LinkedIn 策略

NestJS JWT 策略需要一个秘密或密钥

NestJS / NodeJS / Passport / JWT - 股票当前用户

NestJS jwt-passport 身份验证