首页 > 解决方案 > NestJS jwt-passport 身份验证

问题描述

我想实现一个分布式身份验证库以在多个项目中使用它。该库应实现 JWT 身份验证方法。代码如下:

jwt.strategy.ts

import {ExtractJwt, Strategy} from 'passport-jwt';
import {PassportStrategy} from '@nestjs/passport';
import {Injectable} from '@nestjs/common';
import {JwtPayload, User} from './interfaces';
import {ConfigService} from "./config.service";

@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy, 'jwt') {
  constructor(private readonly configService: ConfigService) {
    super({
      jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
      secretOrKey: configService.get('secretOrPrivateKey'),
    });
  }

  async validate(payload: JwtPayload): Promise<User> {
     return {
      uuid: payload.uuid,
      email: payload.email,
    }
  }
}

jwt.auth.module.ts:

import {Module, DynamicModule} from '@nestjs/common';
import {JwtModule} from '@nestjs/jwt';
import {JwtStrategy} from './jwt.strategy';
import {PassportModule} from '@nestjs/passport';
import {ConfigService} from "./config.service";
import {JwtOptions} from "./interfaces/jwt.options";

@Module({
})

export class JwtAuthModule {
  static forRoot(jwtOptions): DynamicModule {
    return {
      module: JwtAuthModule,
      imports: [
        // JwtModule.register(jwtOptions),
        // PassportModule.register({defaultStrategy: 'jwt'}),
      ],
      providers: [
        JwtStrategy,
        {
          provide: ConfigService,
          useValue: new ConfigService(jwtOptions),
        }
      ],
      exports: [ConfigService, JwtStrategy]
    };
  }
}

我已经在我的app.module.ts

import { Module, NestModule, HttpModule } from '@nestjs/common';
import { MongooseModule } from '@nestjs/mongoose';
import { environment } from './environments';
import { AuthModule } from './auth/auth.module';
import { PermissionModule } from './permission/permission.module';
import {JwtAuthModule} from '@pe/nest-kit';
import {JwtModule} from '@nestjs/jwt';
import {PassportModule} from '@nestjs/passport';

@Module({
  imports: [
    JwtModule.register(environment.jwtOptions),
    PassportModule.register({defaultStrategy: 'jwt'}),
    JwtAuthModule.forRoot(environment.jwtOptions),
    HttpModule,
    AuthModule,
    PermissionModule,
    MongooseModule.forRoot(environment.mongodb),
  ],
})
export class ApplicationModule implements NestModule {
  configure() {
  }
}

但是,每次我尝试打开项目 url 时,都会出现错误:

[Nest] 27645 - 24.10.2018, 15:23:26 [ExceptionsHandler] 未知身份验证策略“jwt”+4119ms 错误:尝试未知身份验证策略“jwt”(/home/user/workspace/permissions/node_modules/passport/lib /middleware/authenticate.js:187:37) 在验证 (/home/user/workspace/permissions/node_modules/passport/lib/middleware/authenticate.js:363:7) 在 Promise (/home/user/workspace/permissions /node_modules/@nestjs/passport/dist/auth.guard.js:83:3) 在 /home/user/workspace/permissions/node_modules/@nestjs/passport/dist/auth.guard.js 的新 Promise () 处: 75:83 在 MixinAuthGuard。(/home/user/workspace/permissions/node_modules/@nestjs/passport/dist/auth.guard.js:47:36) 在 Generator.next () 在 /home/user/workspace/permissions/node_modules/@nestjs/护照/dist/auth.guard.js:19:

我究竟做错了什么?

标签: authenticationjwtnestjsnestjs-passportnestjs-jwt

解决方案


你确定你已经添加了所有需要的包吗?尝试通过身份验证文档https://docs.nestjs.com/techniques/authentication它很好地解释了如何处理 JWT。


推荐阅读