Гнездо Js Паспорт неизвестной стратегии - PullRequest
0 голосов
/ 26 февраля 2020

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

Неизвестная стратегия аутентификации "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') Я следовал руководству по аутентификации nest js из официальных документов, но не могу запустить его в моем UsersModule

Ответы [ 2 ]

1 голос
/ 27 февраля 2020

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

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, но из своего кода вы его нигде не используете. Поэтому, пожалуйста, удалите его, чтобы избежать циклической зависимости.

0 голосов
/ 28 февраля 2020

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

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

вместо

import { Strategy } from "passport-jwt";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...