typescript - En nest.js, al usar el módulo passport, ¿tenemos que usar PassportModule.register() dentro de cada módulo?
Si no los importamos dentro de cada módulo utilizando el decorador @AuthGuard, entonces aparece la siguiente advertencia en los registros.
Para usar "defaultStrategy", por favor, asegúrese de importar PassportModule en cada lugar donde se esté usando AuthGuard(). De lo contrario, passport no funcionará correctamente
@Module({
imports: [
PassportModule.register({ defaultStrategy: 'jwt' }),
JwtModule.register({
secretOrPrivateKey: 'secretKey',
signOptions: {
expiresIn: 3600,
},
}),
UsersModule,
],
providers: [AuthService, JwtStrategy],
})
export class AuthModule {}
¿Hay alguna otra manera además de importar "PassportModule.register({ defaultStrategy: 'jwt' })" dentro de cada módulo?
Respuesta #1
Suponiendo que tus otros módulos estén importando el AuthModule para tener acceso al AuthService, podrías simplemente volver a exportar el 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 {}
Respuesta #2
Solución simple
Lo de PassportModule.register({ … }) solo se necesita si quieres usar la sintaxis AuthGuard con una estrategia predeterminada implícita: @UseGuards(AuthGuard).
No es necesario mencionarlo cada vez que se menciona la estrategia explícitamente:
import { AuthGuard } from '@nestjs/passport';
@UseGuards(AuthGuard('jwt'))
// [...]
Solución con una estrategia por defecto
Para evitar la sintaxis anterior que menciona la estrategia en cada llamada al decorador, puedes definir tu propia guardia que no haga nada más que proporcionar un alias para AuthGuard con tu estrategia predeterminada de elección:
// file jwt.guard.ts
import { Injectable } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';
@Injectable()
export class JwtAuthGuard extends AuthGuard('jwt') { }
Entonces, para usarlo, ya no tienes que hacer ningún PassportModule.register({ … }) en tu módulo. Solo escribe esto en tus archivos:
import { JwtAuthGuard } from '../path/to/module/auth/guards/jwt.guard';
@UseGuards(JwtAuthGuard)
// [...]
Aviso: El guardia personalizado anterior, tal como se muestra, no te permite especificar varias estrategias alternativas a la vez: @UseGuards(JwtAuthGuard(['jwt', 'anonymous'])). Ninguna de tus estrategias se aplicaría de esta manera. En su lugar, tendrías que usar: @UseGuard(AuthGuard('jwt', 'anonymous')). Siéntete libre de mejorar.
