NestJS authentication strategy - how is it accessed?

So, I am confused. I'm slowly getting a grip around NestJS but the way passport works has me baffled.

I followed the tutorial and everything works.

I created a JWT Strategy:

@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy) {
    constructor(private prisma: PrismaService) {
        super({
            jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
            secretOrKey: 'topSecret51',
        });
    }

    async validate(payload: JwtPayload): Promise<User | null> {
        const { email } = payload;
        const user = await this.prisma.user.findOne({
            where: { email }
        });

        if (!user) {
            throw new UnauthorizedException('Athorisation not provided')
        }
        return user;
    }
}

And defined the module:

@Module({
  imports: [
    PassportModule.register({
      defaultStrategy: 'jwt',
    }),
    JwtModule.register({
      secret: 'topSecret51',
      signOptions: {
        expiresIn: 3600,
      },
    })
  ],
  providers: [UserService, PrismaService, JwtStrategy],
  controllers: [UserController],
  exports: [JwtStrategy, PassportModule],
})
export class UserModule {}

And voila a valid token is issued. What I don't understand is how passport accesses the JwtStrategy. How is passport aware that there is a file in my folder structure that contains a JwtStrategy?

1.) It is not dependency injected by the PassportModule or JWTModule2.) It is not passed as an argument to any method

Is there some behind-the-scenes magic that looks through all providers and determines if any of them is a sub-class of the argument provided to PassportStrategy?

1 ответ

С модулем паспорта для NestJS творится много волшебства. Я сделаю все, что смогу, чтобы объяснить, как все это работает, хотя иногда это выходит даже за рамки меня.

Прежде всего следует отметить, что каждый PassportStrategy должен расширить абстрактный миксинPassportStrategy. Этот миксин принимаетStrategy из обычной паспортной упаковки (passport-jwtв этом случае). Эта стратегия имеет имя по умолчанию (jwt здесь), но вы можете передать второй аргумент, чтобы указать свое имя.

Nest творит действительно классную магию, чтобы передать значения из CustomStrategyконструктора super()звонок по паспортам нормальная регистрация. Затем требуетсяCustomStrategy#validate и применяет его к обратному вызову проверки паспорта, что является причиной того, что validateметод должен соответствовать ожидаемому в паспортеverify Перезвоните.

Мы выполнили некоторую регистрацию по паспорту, но для того, чтобы они вызывались правильно, нам нужно заглянуть в AuthGuardмиксин. Обычно мы можем передать стратегию миксину, и эта стратегия должна соответствовать названию паспортной стратегии (например,jwt в этом случае) или его можно установить в PassportModuleс defaultStrategyвариант. Отсюда охранник творит немного магии, чтобы назвать стратегию по имени (jwt, google, localи т. д.) и пройти request, то response, а также nextиз контекста http, который создает Nest. В конце разговораrequest.user устанавливается возвращенным значением из passports.authenticate.

Другие вопросы по тегам