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.
