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 JWTModule
2.) 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
.