Search code examples
javascriptnode.jsmongodbexpresspassport.js

passport authentication error: Strategy#authenticate must be overridden by subclass


I am trying to authenticate and login a user but it show error: Strategy#authenticate must be overridden by subclass, how can i fix this error

What could be the cause?

Passport.js

const LocalStrategy = require('passport').Strategy

const mongoose = require('mongoose')

const bcrypt = require('bcrypt')

const User = require('../models/User')

module.exports = function(passport) {

    passport.use("local",

        new LocalStrategy({usernameField:"email"}, (email, password, done)=>{

            User.findOne({email:email})

                .then(user=>{

                    if(!user){

                        return done(null, false,{message:"That email is not registered"})
                    }

                    bcrypt.compare(password, user.password, (err, isMatch)=>{

                        if(err) throw err

                        if(isMatch){

                            return done(null, user)

                        }else {

                            return done (null, false,{message:"password incorrect"})

                        }
                    })
                })

                .catch(err=>console.log(err))

        })
    )

    passport.serializeUser(function (user, done) {

        done(null, user.id)

    })

    passport.deserializeUser(function (id, done) {

        User.findById(id, function (err, user) {

            done(err, user)
        })
    })
}

Login.js

const express = require('express');

const passport = require("passport");

const router = express.Router();

/* GET users listing. */

router.get('/login', function (req, res, next) {

    res.render('login')

})



router.post('/login', function(req, res, next) {

    passport.authenticate('local', function(err, user, info) {

        if (err) { return next(err); }

        if (!user) { return res.redirect('/login'); }

        req.logIn(user, function(err) {

            if (err) { return next(err); }

            return res.redirect('/');

        });

    })
(req, res, next);

});



module.exports = router

app.js

const express = require('express')

const app = express()

const mongoose = require('mongoose')

const bodyParser = require('body-parser')

const logIn = require('./routes/login')

const flash = require('connect-flash')

const session = require('express-session')

const passport = require("passport");

require('./config/passport')(passport)

app.use(bodyParser.urlencoded({extended : false}))

//express session

app.use(session({

    secret:'secret',

    resave: false,

    saveUninitialized: true,

}))

app.use(passport.initialize())

app.use(passport.session())

//flash connect

app.use(flash())

app.use((req, res, next)=>{

    res.locals.success_msg = req.flash('success_msg')

    res.locals.failure_msg = req.flash('error_msg')

    next()
})

app.use(logIn)

Solution

  • This error occurs when passport fails to instantiate an instance of strategy ,I can't see anything wrong in your code , so I suggest you uninstall passport and install it back again