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 的导出中导出 PassportModule
和 JwtModule
【参考方案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 策略