Brandon Emerson
Brandon Emerson

Reputation: 29

Passport authentication won't pass

I am trying to use passport authentication with a local strategy but the authentication fails every time and doesn't move on to the local strategy. I have added a couple console logs to see where the code is derailed but nothing at all is logged.

users.js(router)

var express = require('express');
var router = express.Router();
var User = require('../models/user');
var multer=require('multer');
var passport=require('passport');
var LocalStrategy=require('passport-local').Strategy;

/* GET users listing. */
router.get('/', function(req, res, next) {
  res.send('respond with a resource');
});

router.get('/register', function(req, res, next) {
  res.render('register',{
    'title':'Register'
  });
});

router.get('/login', function(req, res, next) {
  res.render('login',{
    'title':'Login'
  });
});

passport.use(new LocalStrategy(
    function(username,password,done){
        console.log('words');
        User.getUserByUsername(username,function(err,user){
            if (err) throw err;
            if(!user){
                console.log('Unknown user');
                return done(null,false);
            }
        });
    }
));

router.post('/login',passport.authenticate('local',{failureRedirect:'/users/register'}),function(req,res){
    console.log('Authentication succesful');
    req.flash('success','You are logged in');
    res.redirect('/');
});

module.exports = router;

Upvotes: 0

Views: 725

Answers (1)

Cédric De Dycker
Cédric De Dycker

Reputation: 81

Did you set the session and added passport to the router? I don't know if setting the initialize and session method in two different spots will work. This is how I made it work: All set in in a router

let express = require('express');
let session = require('express-session');
let passport = require('passport');
let LocalStrategy = require('passport-local').Strategy;
let router = express.Router();

passport.use(new LocalStrategy(
function(username, password, done) {
     User.findOne({username: username}, function (err, user) {
          if (err) { return done(err); }
          if (!user) {
               return done(null, false, { message: 'Incorrect username.' });
          }
          user.comparePassword(password, function (err, isMatch) {
               if (err) { return done(err); }
               if(!isMatch){
                    return done(null, false, { message: 'Incorrect password.' });
                } else {
                    return done(null, user);
                }
          });
       });
    }

));
passport.serializeUser(function(user, done) {
        done(null, {email: user.email, roles : user.roles});
});
passport.deserializeUser(function(session, done) {
    User.findOne({email: session.email}, function(err, user) {
          done(err, user);
    });
});
router.use(session({ secret: 'my super secret',name: 'my-id', resave: false, saveUninitialized: false }));

router.use(passport.initialize());
router.use(passport.session());

Furthermore if this ever goes into production you need a different session handler than express-session like MongoStore or Redis

The routes

/* GET home page. */
 router.get('/', require('connect-ensure-login').ensureLoggedIn('login'), function (req, res, next) {
     if (req.user) {
         res.render('index');
    } else {
         res.redirect('/login');
    }
});

 router.get('/login', function (req, res, next) {
     res.render('login');
});
 router.post('/login', passport.authenticate('local', {
     successRedirect: '/',
     failureRedirect: '/login'
})); 

 router.get('/logout', function (req, res) {
req.logout();
res.render('logout');
});

Upvotes: 1

Related Questions