trouble integrating express with passport

Viewed 22

I hope someone can help me out as ive spent far too long scratching my head over this issue. I have a small React, Express, MongoDb app which i want to integrate with Passport.js. However I just cannot get the passport to authenticate.

I have a controller set up for a route /login. I have a console log at the start of the file so I know that the code goes into that block. However the code doesnt enter the passport authenticate block.

const bcrypt = require('bcrypt');
const user = db.user;
const passport = require('passport');

exports.login = async (req, res, next) => {
    console.log('inside login controller');
    passport.authenticate('local', function (err, user, info) {
        console.log('inside passport');
        req.login(user, function (err) {
            console.log('inside req login');
            if (err) {
                return res.status(400).json({ errors: err });
            }
            return res
                .status(200)
                .json({ success: `logged in ${user.id}` })
                .redirect('/users/' + user);
        })(req, res, next);
    });
};

My server file looks like this (omitted a lot of stuff to save space but the gist is as follows):

const passport = require('./passport/setup');
const initialisePassport = require('./passport/setup');
const auth = require('./controller/user.controller');

app.use(
    session({
        secret: 'a_very_special_secret',
        resave: false,
        saveUninitialized: true,
        expires: new Date(Date.now() + 24 * 60 * 60 * 1000), // 24 hours
        store: new MongoStore({ mongooseConnection: mongoose.connection }),
    })
);
app.use(cookieParser('a_very_special_secret'));
app.use(initialisePassport.initialize());

app.use(passport.session());

The last file is the passport setup file which is here:

const bcrypt = require('bcrypt');
const db = require('../models');
const User = db.user;
const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;

passport.serializeUser((user, done) => {
    done(null, user.id);
});

passport.deserializeUser((id, done) => {
    User.findById(id, (err, user) => {
        done(err, user);
    });
});

//Local strategy

passport.use(
    new LocalStrategy({ usernameField: 'email' }, (email, password, done) => {
        console.log('inside passport strat');
        User.findOne({ email })
            .then((user) => {
                bcrypt.compare(password, user.password, (err, isMatch) => {
                    if (err) throw err;
                    if (isMatch) {
                        return done(null, user);
                    } else {
                        return done(null, false, { message: 'Wrong password' });
                    }
                });
            })
            .catch((err) => {
                return done(null, false, { message: err });
            });
    })
);

module.exports = passport;

Id love a helping hand on where im going wrong with this. So basically when i post to the route via the front end I get the message in my console that im inside the login controller but the authentication process doesnt happen.

0 Answers
Related