aboutsummaryrefslogtreecommitdiff
path: root/src/server/authentication/Passport.ts
blob: a62d38e3e167e0ba9c3ac3748613c615bc7b50dd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import * as passport from 'passport';
import * as passportLocal from 'passport-local';
import User, { DashUserModel } from './DashUserModel';

const LocalStrategy = passportLocal.Strategy;

passport.serializeUser<any, any>((req, user, done) => {
    done(undefined, (user as DashUserModel)?.id);
});

passport.deserializeUser<any, any>((id, done) => {
    User.findById(id)
        .exec()
        .then((user: DashUserModel) => 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: DashUserModel) => {
                if (!user) {
                    done(undefined, false, { message: 'Invalid email or password' }); // invalid email
                } else {
                    user.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: Error) => done(error));
    })
);