【问题标题】:Passport req.isAuthenticated() doesn't work护照 req.isAuthenticated() 不起作用
【发布时间】:2018-12-07 02:26:46
【问题描述】:

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

(更新)

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 是我的中间件,我知道为什么它总是返回 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 中间件有什么问题吗?

或者我重定向到仪表板视图?

提前致谢!

【问题讨论】:

  • 那可能是因为你还没有定义认证策略和序列化/反序列化逻辑。
  • @SwatiAnand 我应该如何让它完全正确?

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


【解决方案1】:

当你调用 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() 方法时,passport 会检查 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);
  });
});

【讨论】:

  • 我已经更新了我的模块,我尝试了你的代码,但是当我在重定向到“仪表板”时使用“checkAuth”中间件时它不起作用
猜你喜欢
  • 2016-04-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-29
  • 2017-11-01
  • 1970-01-01
  • 2017-10-18
  • 1970-01-01
  • 2016-10-27
相关资源
最近更新 更多