【问题标题】:Error: Unknown authentication strategy "local" (Express & Passport)错误:未知身份验证策略“本地”(Express & Passport)
【发布时间】:2016-09-27 14:27:40
【问题描述】:

我正在尝试在 express 应用中使用护照身份验证。

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
}));

每次我尝试注册测试用户时,它都能正常工作,但它会显示如下错误:

Error: Unknown authentication strategy "local"

你能给我一些建议吗?

【问题讨论】:

  • 您使用的是本地护照吗?
  • 现在只使用护照模块
  • 你可以在这里查看整个项目的源代码:github.com/kiknag/Social-App

标签: javascript mongodb express passport.js passport-local


【解决方案1】:

您似乎尚未设置 Passport 以使用您的本地护照策略。 您需要导入它、实例化它,然后指示 Passport 使用它。这是一个例子:

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('/');
    });
  });
});

请阅读该插件的文档here。 另外,here's an example app 使用该身份验证策略。

【讨论】:

  • 谢谢,我现在就试试。
【解决方案2】:

尝试在本地之后使用回调函数而不是传递对象。像这样的:

    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("/");
              });
            }
        });
    });

【讨论】:

    猜你喜欢
    • 2017-05-25
    • 2017-03-02
    • 2022-01-11
    • 2014-02-22
    • 2021-12-15
    • 2018-06-08
    • 2022-07-19
    • 1970-01-01
    • 2016-02-28
    相关资源
    最近更新 更多