Search code examples
node.jsexpresspassport.jspassport-local

Passport does not call the authentication strategy


today I was trying to get a passport authentication working. The email and password is static now but I will change that later. I have a lot of debug messages but only the ones outside of the Strategy. No errors or warnings regarding passport are displayed.

I have already tried to use different body parser modes (extented = true, extented = false).

Strategy

const LocalStrategy = require('passport-local').Strategy;

module.exports = function(passport) {
  passport.use(
    new LocalStrategy((email, password, done) => {
        console.log('Authentication started');
        var user = null;
        if(email == 'test@mytest.com') {
            if(password == 'test') {
                user = {
                    email
                }
                console.log('Authenticated')
                return done(null, user);
            }
        }
        console.log('Error')
        return done(null, user, {message: 'EMail or Password was wrong'});
    })
  );
  passport.serializeUser(function(user, done) {
    done(null, user.email);
  });

  passport.deserializeUser(function(id, done) {
    done(err, user);
  });
};

app.js (contains only important parts)

const express = require('express');
const expressSession = require('express-session')
const bodyParser = require('body-parser');
const expressLayouts = require('express-ejs-layouts');
const app = express();
const https = require('https');
const http = require('http');

app.use(expressSession({ secret: 'secret' }));

// Body Parser
app.use(bodyParser.urlencoded({extended:false}));
app.use(bodyParser.json());


// Passport
const passport = require('passport');
require('./config/passport')(passport);
app.use(passport.initialize());
app.use(passport.session());

// View Engine
app.set('view engine', 'ejs');
app.use(expressLayouts);

app.get('/applications', (req,res) => {
    res.render('applications', {
        user: req.user
    });
});
app.post('/applications', (req, res, next) => {
    console.log(req.body);
    passport.authenticate('local', {
      successRedirect: '/applications',
      failureRedirect: '/',
      failureFlash: false
    })(req, res, next);
  });

https.createServer(httpsOptions, app)
    .listen(7443, () => {
        console.log('HTTPS Server started on Port 7443')
});
http.createServer(app)
    .listen(7080, () => {
        console.log('HTTP Server started on Port 7080')
});

Solution

  • Make sure you are using the proper fields in your POST request. I noticed that in your strategy, you use the variables email and password. While your variable names aren't important, the fields you send in your POST request are. By default, passport-local uses the POST fields username and password. If one of these fields aren't present, the authentication will fail. You can change this to use email instead like so:

    passport.use(
      new LocalStrategy({
        usernameField: 'email'
    }, (email, password, done) => {
          console.log('Authentication started');
          // Your authentication strategy
      })
    );
    

    Assuming you have the right POST fields, in order to use req.user in requests, you must have properly set up your passport.deserializeUser function. Testing your code, the authentication strategy is working fine for me, however I receive a reference error upon deserializeUser.