护照req.isAuthenticated()不起作用

时间:2018-06-28 05:52:01

标签: node.js express session authentication passport.js

我正在使用快速会话和护照进行身份验证。 这是我的模块:

(已更新)

passport.use(new LocalStrategy(
  function(username, password, done) {
        LamAdmin.findOne({ email: username }, function (err, user) {
            if (err) { return done(err); }
            if (!user) { return done(null, false, { message: 'Incorrect username' }); }
            if (!comparePassword(user.password, password)) { return done(null, false, { message: 'Incorrect password' }); }
            return done(null, user);
        });
  }
));

router.post('/login', passport.authenticate('local',{
    successRedirect: '/p/dashboard',
    failureRedirect: '/p',
    failureFlash: true
}));


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

passport.deserializeUser(function(id, done) {
  LamAdmin.findById(id, function (err, user) {
    done(err, user);
  });
});

function checkAuth(req,res,next) {
    if (req.isAuthenticated()) {
        next();
    } else {
        res.redirect('/p');
    }
}

// //DOES NOT WORK WITH CHECKAUTH MIDDLEWARE
// router.get('/dashboard',(req,res,next)=> {
//      res.render('dashboard');
// });

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

checkAuth是我的中间件和idk,为什么它总是返回false。 这是app.js中的通行证和会话配置:

//sessions
app.use(session({
  secret: 'secret',
  saveUninitialized: true,
  resave: true,
  cookie: { secure: false } // Remember to set this
}));

//passport
app.use(passport.initialize());
app.use(passport.session());

我的checkAuth中间件有什么问题吗?

还是我重定向到仪表板视图?

谢谢!

1 个答案:

答案 0 :(得分:0)

当您调用passport.authenticate()方法时,它将使用一种策略来对用户进行身份验证。如果您将用户信息存储在本地数据库中,则可以使用将使用用户名和密码进行身份验证的本地策略。因此,在您的app.js中添加以下内容:

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

passport.use(new LocalStrategy(
  function(username, password, done) {
    /* Change this to fetch user info from your db
    User.findOne({ username: username }, function (err, user) {
      if (err) { return done(err); }
      if (!user) { return done(null, false); }
      if (!comparePasswords(user.password, password)) { return done(null, false); }
      return done(null, user);
    }); 
    */
  }
));

对用户进行身份验证后,将调用上述方法返回的用户对象作为参数传递并调用serializeUser()方法,然后将返回的值附加到当前用户会话的req.session.passport.user

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

在每个后续请求上,当调用isAuthenticated()方法时,护照都会检查req.session.passport.user中是否存在某些值。如果存在用户信息,它将调用deserializeUser()方法,该方法会将用户信息附加到请求中,并可以通过req.user

进行访问。

passport.deserializeUser(function(id, done) {
  // Replace it with your db
  User.findById(id, function (err, user) {
    done(err, user);
  });
});