【发布时间】:2018-12-21 17:08:46
【问题描述】:
我正在使用护照登录并显示“/home”。登录有效并重定向到“/home”。但是这个端点不受保护,可以通过在浏览器中输入来访问。我尝试使用 req.isAuthenticated () (并在这里经历了多个问题)无济于事。
路由//index.js
var express = require('express');
var router = express.Router();
var User = require('../models/user');
var passport = require('passport');
var session = require('express-session');
const 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.password != password) {
return done(null, false);
}
return done(null, user);
});
}
));
router.get('/', function(req, res, next) {
res.render('index', { title: 'Express' });
});
router.get('/login', function(req, res, next) {
res.render('login');
});
router.post('/login', passport.authenticate('local', { failureRedirect : '/', successRedirect : '/home'}))
router.get('/register', function(req, res, next) {
res.render('register');
});
router.get('/logout', function(req, res){
req.logout();
res.redirect('/');
});
router.get('/home', ensureLocalAuthenticated, function(req, res){
res.render('home', { user: req.user });
});
function ensureLocalAuthenticated(req, res, next) {
console.log(req.isAuthenticated());
if (req.isAuthenticated()) { return next(); }
res.redirect('/login');
}
module.exports = router;
在我的 app.js 文件中,我已经像这样配置了护照:
//passportconfig
app.use(passport.initialize());
app.use(passport.session());
passport.serializeUser(function(user, done){
done(null, user.id)
})
passport.deserializeUser(function(id, done){
User.findById(id, function(err, user){
done(err, user)
})
})
app.use('/', indexRouter);
app.use('/users', usersRouter);
isAuthenticated 总是返回 false,无法使用该中间件登录。如果我删除它,我可以正常登录,但所有用户都可以访问“/home”
【问题讨论】:
-
req.user给你什么?试着把它放在ensureLocalAuthenticated -
我在
ensureLocalAuthenticated中添加了console.log(req.user)。它返回未定义。我尝试登录后 -
这意味着护照无法加载用户。在
passport.serializeUser中查看user和req.cookies的值是什么 -
另外,您使用的是
cookie-parser吗?因为这会加载解析并加载cookie,所以passport会使用cookie来加载用户。 -
嘿,我想通了。这在 app.js 中丢失了。谢谢
app.use(require('express-session')({ secret: 'keyboard cat', resave: false, saveUninitialized: false }));
标签: node.js express passport.js