Kiknaio
Kiknaio

Reputation: 76

Error: Unknown authentication strategy "local" (Express & Passport)

I'm trying to use passport authentication within express app.

router.get('/signup', (req ,res) => {
  res.render('signup');
});

router.post('/signup', function(req, res, next) {
  var username = req.body.username;
  var password = req.body.password;

  User.findOne({ username: username }, function(err, user) {

    if(err) { return next(err); }
    if(user) {
      req.flash('error', 'User already exists');
      return res.redirect('/signup');
    }

    var newUser = new User({
      username: username,
      password: password
    });
    newUser.save(next);
  });
}, passport.authenticate('local', {
  successRedirect: '/',
  failureRedirect: '/signup',
  failureFlash: true
}));

Every time I try to sign up test user, it works but it shows me an error like this:

Error: Unknown authentication strategy "local"

Can you advise me something.

Upvotes: 1

Views: 3671

Answers (2)

Mike Hanslo
Mike Hanslo

Reputation: 294

It looks like you haven't setup Passport to use your passport-local strategy yet. You'll need to import it, instantiate it, and then instruct Passport to use it. Here's an example:

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

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); }
      if (!user.verifyPassword(password)) { return done(null, false); }
      return done(null, user);
    });
  }
));

router.post('/signup', function(req, res, next) {
  var username = req.body.username;
  var password = req.body.password;

  User.findOne({ username: username }, function(err, user) {

    if(err) { return next(err); }
    if(user) {
      req.flash('error', 'User already exists');
      return res.redirect('/signup');
    }

    var newUser = new User({
      username: username,
      password: password
    });
    newUser.save(next);

    passport.authenticate('local', { failureRedirect: '/signup' }),
     function(req, res) {
      res.redirect('/');
    });
  });
});

Please read the documentation here for that plugin. Also, here's an example app using that auth strategy.

Upvotes: 3

Georgi Stephanov
Georgi Stephanov

Reputation: 45

Try using a callback function after local instead of passing an object. Something like this:

    router.post("/register", function(req, res){
      var newUser = new User({username: req.body.username});
      User.register(newUser, req.body.password, function(err, user){
          if(err){
              req.flash("error", err.message); //such as the username is taken or no username entered etc.
              res.redirect("/register");
          } else {
            passport.authenticate("local")(req, res, function(){
                res.redirect("/");
              });
            }
        });
    });

Upvotes: 0

Related Questions