【问题标题】:PassportJS not authenticatePassportJS 未通过身份验证
【发布时间】:2014-01-12 12:14:54
【问题描述】:

我做错了什么?它总是重定向到失败页面,但我无法调试。

// passport
var passport = require('passport'),
    LocalStrategy = require('passport-local').Strategy,
    User = require('./models/user.js').Model;

passport.use(new LocalStrategy({
    usernameField: 'email',
    passwordField: 'password'
  },
  function(username, password, done) {
    User.findOne({ username: username }, function(err, user) {
      console.log('entrou');
      if (err) { return done(err); }
      if (!user) {
        return done(null, false, { message: 'Incorrect username.' });
      }
      if (!user.validPassword(password)) {
        return done(null, false, { message: 'Incorrect password.' });
      }
      return done(null, user);
    });
  }
));


// login
app.get('/login', user.login);
app.post('/login',
  passport.authenticate('local', { 
    successRedirect: '/',
    failureRedirect: '/login' 
  })
);

【问题讨论】:

  • findOne 是如何实现的?
  • 另外,erruser 在登录后是否包含预期值(console.log 它们)?您是否实现了 passport.serializeUserpassport.deserializeUser 以及 Passport 的所有其他要求?
  • 我遇到了类似的问题,调试显示 (!user.validPassword) 在内部方法将其设置为 true 之前返回 false。 (几乎就像它在异步方法中执行一样,但它是同步的,对吗?) - 编辑:我想通了,bcrypt 在我的 auth 函数中触发了一个异步方法 - 所以它在有机会评估之前评估 false来自 bcrypt 的回应。

标签: javascript node.js express passport.js


【解决方案1】:

我也遇到了一些关于 passport.js 无法进行身份验证的问题。所以这就是它对我的工作方式:

/**
 * Local authentication strategy
 *
 */
passport.use('local', new LocalStrategy(function(username, password, done) {
  //async code waits until next()
  process.nextTick(function() {
    //searches the database for the user
    //that matches the username|e-mail and password provided
    models.User.checkCredentials(username, password, function(err, user) {
      if (err) {
        return done(err);
      }

      //user is not found
      if (!user) {
        return done(null, false, {message: 'Unknown user ' + username});
      }

      return done(null, user);
    });
  });
}));

登录一个用户

app.post('/login', function(req, res, next) {
  passport.authenticate('local', function(err, user, info) {
    if (err) { return next(err); }
    // if user is not found due to wrong username or password
    if (!user) {
      return res.render('login', {
        //you can send a message to your view
        message: 'Invalid username or password'
      });
    }
    //passport.js has a logIn user method
    req.logIn(user, function(err) {
      if (err) { return next(err); }

      return res.redirect('/');
    });
  })(req, res, next);
});

【讨论】:

    猜你喜欢
    • 2015-10-21
    • 2016-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-03
    相关资源
    最近更新 更多