我正在使用快速会话和护照进行身份验证。 这是我的模块:
(已更新)
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中间件有什么问题吗?
还是我重定向到仪表板视图?
谢谢!
答案 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);
});
});