typescript - I nest.js, när man använder passport-modulen, måste vi använda PassportModule.register() inuti varje modul?


Om vi inte importerar dem i varje modul med hjälp av @AuthGuard-dekoratören så visas följande varning i loggarna.

För att använda "defaultStrategy", vänligen se till att importera PassportModule på varje plats där AuthGuard() används. Annars kommer inte passport att fungera korrekt

@Module({
  imports: [
    PassportModule.register({ defaultStrategy: 'jwt' }),
    JwtModule.register({
      secretOrPrivateKey: 'secretKey',
      signOptions: {
        expiresIn: 3600,
      },
    }),
    UsersModule,
  ],
  providers: [AuthService, JwtStrategy],
})
export class AuthModule {}

Finns det något annat sätt förutom att importera "PassportModule.register({ defaultStrategy: 'jwt' })" i varje modul.

Svar #1

Om vi antar att dina andra moduler importerar AuthModule för att få tillgång till AuthService kan du helt enkelt återexportera PassportModule:

const passportModule = PassportModule.register({ defaultStrategy: 'jwt' });

@Module({
  imports: [
    passportModule,
    JwtModule.register({
      secretOrPrivateKey: 'secretKey',
      signOptions: {
        expiresIn: 3600,
      },
    }),
    UsersModule,
  ],
  providers: [AuthService, JwtStrategy],
  exports: [passportModule]
})
export class AuthModule {}

Svar #2

Enkel lösning

Sakerna med PassportModule.register({ … }) behövs bara om du vill använda AuthGuard-syntaxen med en underförstådd standardstrategi: @UseGuards(AuthGuard).

Det behövs inte när man nämner strategin uttryckligen varje gång:

import { AuthGuard } from '@nestjs/passport';

@UseGuards(AuthGuard('jwt'))
// [...]

Lösning med en standardstrategi

För att undvika den ovanstående syntaxen som nämner strategin i varje dekoratoranrop kan du definiera din egen skydd som inte gör något annat än att tillhandahålla en alias för AuthGuard med din valda standardstrategi:

// file jwt.guard.ts
import { Injectable } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';

@Injectable()
export class JwtAuthGuard extends AuthGuard('jwt') { }

För att använda det behöver du inte längre göra något PassportModule.register({ … })-arbete i din modul. Skriv bara detta i dina filer:

import { JwtAuthGuard } from '../path/to/module/auth/guards/jwt.guard';

@UseGuards(JwtAuthGuard)
// [...]

Varning: Den ovan nämnda anpassade vakten, som visas, tillåter dig inte att ange flera alternativa strategier samtidigt: @UseGuards(JwtAuthGuard(['jwt', 'anonymous'])). Ingen av dina strategier skulle tillämpas på detta sätt. Istället skulle du behöva använda: @UseGuard(AuthGuard('jwt', 'anonymous')). Känn dig fri att förbättra.

Relaterade artiklar