Search code examples
mysqlnode.jsexpresspassport.jsknex.js

passport.authenticate() returns undefined user


I want to build an application with login and register. Register works fine, but login not (it gives me 501-not implemented error). Here is a snippet from my code:

const passport = require('passport')

router.post('/register', (req, res) => {
  knex
    .from('user')
    .insert({
      firstname: req.body.firstname,
      lastname: req.body.lastname,
      email: req.body.email,
      password: req.body.password,
    })
    .then(() => {
      res.json({ success: true, message: "Data successfully inserted." })
    })
    .catch(() => {
      res.json({ success: false, message: "Error in adding user. Please try again." })
    })
})

router.post('/login', function (req, res, next) {
  passport.authenticate('local', function (err, user, info) {
    console.log("1 err " + JSON.stringify(err))
    console.log("2 user " + JSON.stringify(user))
    console.log("3 info " + JSON.stringify(info))
    if (err) { return res.status(501).json(err); }
    if (!user) { return res.status(501).json(info); }
    req.logIn(user, function (err) {
      if (err) { return res.status(501).json(err); }
      return res.status(200).json({ message: 'Login Success' });
    });
  })(req, res, next);
});

When I try to login, I get:

1 err [{"id":1,"firstname":"john","lastname":"doe","email":"[email protected]","password":"joe"}]

2 user undefined

3 info undefined

Why is user undefined? I was expecting to get a true/false value. And also why does err has that value? Because of that, it will always enter on if(err).

I can provide more from my code, if u ask to. Thank you!

EDIT: localpassport

const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;
const knex = require('./db.js');

passport.use('local', new LocalStrategy({
  usernameField: 'email',
  passwordField: 'password'
},
  function (username, password, done) {
    knex('user')
      .where('email', '=', username)
      .then((err, user) => {
        if (err) { return done(err); }
        if (!user) {
          return done(null, false, { message: 'Incorrect username.' });
        }
        if (!user.isValid(password)) {
          return done(null, false, { message: 'Incorrect password.' });
        }
        return done(null, user);
      })
  }
));

passport.serializeUser((user, done) => {
  done(null, user.id);
});

passport.deserializeUser((id, done) => {
  knex.from('user').where('id', '=', id)
    .then((user) => { done(null, user); })
    .catch((err) => { done(err, null); });
});

module.exports = passport;

Solution

  • The problem was inside localpassport:

    passport.use('local', new LocalStrategy({
      usernameField: 'email',
      passwordField: 'password'
    },
      function (username, password, done) {
        knex('users')
          .where('email', '=', username)
          .then((user) => {
            if (!user) {
              return done(null, false, { message: 'Incorrect username.' });
            }
            if (password != user[0].password) {
              return done(null, false, { message: 'Incorrect password.' });
            }
            return done(null, user[0]);
          })
      }
    ));
    

    There was no attribute such err.