Search code examples
node.jsexpresspassport.jspassport-local

PassportJS and local strategy


I get an issue using PassportJS and my local strategy. I'm using ExpressJS 4.

My app.js (reduced, without express init) :

var express                        = require('express'),
    ejs                            = require('ejs'),
    path                           = require('path'),
    expressLayouts                 = require('express-ejs-layouts'),
    session                        = require('express-session'),
    compression                    = require('compression'),

    _                              = require('lodash'),
    fs                             = require('fs-extra'),
    colors                         = require('colors'),
    passport                       = require('passport'),
    flash                          = require('connect-flash'),

    localStrategyMiddleware        = require('./middlewares/localStrategy'),
    logMiddleware                  = require('./middlewares/log'),
    localsMiddleware               = require('./middlewares/locals'),
    securityMiddleware             = require('./middlewares/security');

this.app.use(session({
  secret : 'd4qs45sdq6',
  // name : 'sessionId',
  // proxy: true,
  resave: true,
  saveUninitialized: true
}));

this.app.use(flash());
this.app.use(function(request, response, next) {
  response.locals.flash = {
    info: request.flash('info'),
    success: request.flash('success'),
    warning: request.flash('warning'),
    danger: request.flash('danger')
  };
  next();
});

this.app.use(passport.initialize());
this.app.use(passport.session());

this.app.post('/test', passport.authenticate('local', {
      successRedirect: '/user/success',
      failureRedirect: '/user/failure',
      failureFlash: true,
      successFlash: true
    }), function(request, response) {
  console.log('test');
});

My strategy (./middlewares/localStrategy) :

var passport        = require('passport'),
    LocalStrategy   = require('passport-local').Strategy,
    sequelize       = require('../databases/Database').connexion,
    UserModel       = require('../app/models/UserModel')(sequelize);

passport.use(new LocalStrategy(
  function(username, password, done) {

    console.log('test');

    UserModel.findOne({ username: username }, function (err, user) {
      if (err) { return done(err); }

      if (!user) {
        return done(null, false, { message: 'Incorrect username.' });
      }

      if (!user.validPassword(password)) {
        return done(null, false, { message: 'Incorrect password.' });
      }

      return done(null, user);
    });
  }
));

passport.serializeUser(function(user, done) {
  console.log(user);
  done(null, user.id);
});

passport.deserializeUser(function(id, done) {
  console.log(id);
  UserModel.findById(id, function(err, user) {
    done(err, user);
  });
});

module.exports = passport;

Issue : I get no logs and I'm every time redirected to user/failure.

Edit 1 :

<form action="/test" method="post">
  <input type="hidden" name="_csrf" value="<%=csrfToken%>">
  <input type="text" name="user[username]" placeholder="username">
  <input type="text" name="user[password]" placeholder="password">
  <input type="submit">
  <input type="reset">
</form>

Solution

  • If you are getting no logs then that tells you that your app.js file doesn't have access to the code in ./middlewares/localStrategy

    Try changing

    localStrategyMiddleware = require('./middlewares/localStrategy')

    to simply

    require('./middlewares/localStrategy')
    

    Also you need to change your name attributes on your form to match with those that passport uses, I think the default are username and password, so unless you want to specify alternatives in your localStrategy you should use the following.

      <input type="text" name="username" placeholder="username">
      <input type="text" name="password" placeholder="password">