1

I'm trying to implement local authentication with passport js and sequalize in express. The problem im having is the success callback never fires on successful authentication. The log shows that the user is found but the users object is never logged in the request callback nor is res.send fired.

route and strategy

passport.use(
  'local',
  new LocalStrategy(
    {
      usernameField: 'email',
      passwordField: 'password',
      passReqToCallback: true,
    },
    (req, email, password, done) => {
      // find user
      User.findOne({ where: { email } }).then(user => {
        if (!user) {
          return done(null, false);
        }
        if (password !== user.password) {
          return done(null, false);
        }
        console.log('user found!');
        return done(null, user);
      });
    },
  ),
);
app.use(passport.initialize());

// routes
app.post(
  '/login',
  passport.authenticate('local'),
  (req, res) => {
    console.log(req.user);
    res.send('logged in');
    // const expiresIn = 60 * 60 * 24 * 180; // 180 days
    // const token = jwt.sign(req.user, config.auth.jwt.secret, { expiresIn });
    // res.cookie('id_token', token, { maxAge: 1000 * expiresIn, httpOnly: true });
  },
);

app logs

 express:router:layer new '/' +0ms
  express:router:route new '/login' +1ms
  express:router:layer new '/login' +0ms
  express:router:route post '/login' +0ms
  express:router:layer new '/' +0ms
  express:router:route post '/login' +0ms
  express:router:layer new '/' +0ms
  express:router:route new '/users' +0ms
  express:router:layer new '/users' +0ms
  express:router:route get '/users' +0ms
  express:router:layer new '/' +0ms
  express:router:route new '/signup' +0ms
  express:router:layer new '/signup' +1ms
  express:router:route post '/signup' +0ms
  express:router:layer new '/' +0ms
  express:router use '/' <anonymous> +0ms
  express:router:layer new '/' +0ms
  express:router use '/' <anonymous> +0ms
  express:router:layer new '/' +0ms
  express:router use '/' <anonymous> +0ms
  express:router:layer new '/' +0ms
  express:application set "port" to '3001' +0ms
Executing (default): SELECT 1+1 AS result
Connection has been established successfully.
  express:router dispatching POST /login +4s
  express:router query  : /login +2ms
  express:router expressInit  : /login +0ms
  express:router favicon  : /login +2ms
  express:router logger  : /login +0ms
  express:router jsonParser  : /login +2ms
  express:router urlencodedParser  : /login +28ms
  express:router cookieParser  : /login +0ms
  express:router serveStatic  : /login +1ms
  express:router initialize  : /login +0ms
Executing (default): SELECT "id", "firstName", "lastName", "username", "email", "password", "createdAt", "updatedAt" FROM "users" AS "user" WHERE "user"."email" = 'a' LIMIT 1;
user found!
  express:router <anonymous>  : /login +25ms
  express:router <anonymous>  : /login +1ms
  express:view require "jade" +0ms
  express:view lookup "error.jade" +190ms
  express:view stat "/home/zmigaddo/sc/views/error.jade" +0ms
  express:view render "/home/zmigaddo/sc/views/error.jade" +1ms
POST /login 500 346.104 ms - 1910
wizzfizz94
  • 1,288
  • 15
  • 20
  • I haven't seen any example where LocalStrategy receive the req as parameter, always only 3 parameters, something like this: (username, password, done) Try to do it like in the example of this site: http://www.passportjs.org/docs/username-password/ – David Vicente Jan 21 '19 at 08:50
  • DavidVicente yes i've also tried removing the req parameter but it had no effect. – wizzfizz94 Jan 21 '19 at 23:43

1 Answers1

1

I solved the issue. After running again i received the error Error: Failed to serialize user into session. Following this question i added the following code to serialise and deserialise users and fix the issue.

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

passport.deserializeUser(function(user, done) {
  done(null, user);
});
wizzfizz94
  • 1,288
  • 15
  • 20