Я настроил локальную стратегию для включения user instance
пользователя в полезную нагрузку JWT, конечно в формате JSON, следующим образом:
passport.use(new LocalStrategy({
usernameField: 'email',
passwordField: 'password'
},
async function (email, password, done) {
try {
const user = await User.findOne({ email })
const isCorrectPassword = await bcrypt.compare(password, user.password)
if (!user || !isCorrectPassword) {
return done(null, false, { message: "Email o contraseña incorrecto/s" })
}
return done(null, user.toJSON(), { message: "Ingreso existoso"})
} catch (e) {
return done(e)
}
}
))
Теперь, когда один из моих маршрутов вызывает passport.authenticate()
, моя стратегия JWT настроена на извлечение идентификатора пользователя из полезной нагрузки и последующий запрос к базе данных для возврата экземпляра модели mon goose из этого идентификатора для сохранения в req.user
. Например:
passport.use(new JWTStrategy({
jwtFromRequest: ExtractJWT.fromAuthHeaderAsBearerToken(),
secretOrKey: process.env.JWT_SECRET
},
async function(jwtPayload, done) {
try {
const user = await User.findById(jwtPayload._id)
return done(null, user)
} catch (e) {
return done(e)
}
}
))
Я чувствую, что запрашиваю БД для получения той же информации, которая закодирована в полезной нагрузке, супер неэффективно, поэтому я бы хотел обойтись без const user = await User.findById(jwtPayload._id)
, и вместо этого вернуть полезную нагрузку (return done(null, jwtPayload)
), но поскольку jwtPayload
на самом деле JSON, а не объект mon goose, я боюсь, что он не будет работать из коробки.
Как мог Я совершил sh это? Есть ли функция mon goose, которая переводит JSON в экземпляр модели?