import * as passport from 'passport'; import * as passportLocal from 'passport-local'; import { DashUserModel, default as User } from './DashUserModel'; const LocalStrategy = passportLocal.Strategy; passport.serializeUser((req, user, done) => { done(undefined, (user as any)?.id); }); passport.deserializeUser((id, done) => { User.findById(id) .exec() .then(user => done(undefined, user)); }); // AUTHENTICATE JUST WITH EMAIL AND PASSWORD passport.use( new LocalStrategy({ usernameField: 'email', passReqToCallback: true }, (req, email, password, done) => { User.findOne({ email: email.toLowerCase() }) .then(user => { if (!user) return done(undefined, false, { message: 'Invalid email or password' }); // invalid email (user as any as DashUserModel).comparePassword(password, (error: Error, isMatch: boolean) => { if (error) return done(error); if (!isMatch) return done(undefined, false, { message: 'Invalid email or password' }); // invalid password // valid authentication HERE return done(undefined, user); }); }) .catch(error => done(error)); }) );