Node.js 快速护照检查用户是否经过身份验证
我正在使用passport登录并显示“/home”。登录有效并重定向到“/home”。但此端点不受保护,可以通过在浏览器中键入来访问。我尝试使用req.isAuthenticated()(并在此处查看了多个问题)但没有用 路由//index.jsNode.js 快速护照检查用户是否经过身份验证,node.js,express,passport.js,Node.js,Express,Passport.js,我正在使用passport登录并显示“/home”。登录有效并重定向到“/home”。但此端点不受保护,可以通过在浏览器中键入来访问。我尝试使用req.isAuthenticated()(并在此处查看了多个问题)但没有用 路由//index.js var express = require('express'); var router = express.Router(); var User = require('../models/user'); var passport = require(
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文件中,我对passport进行了如下配置:
//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”将以下行添加到app.js对我来说很有用:
app.use(require('express-session')({
secret: 'keyboard cat',
resave: false,
saveUninitialized: false
}));
因此,passport的配置如下:
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var passport = require('passport');
var mongoose = require('mongoose');
var User = require('./models/user')
const LocalStrategy = require('passport-local').Strategy;
使用它们:
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(require('express-session')({
secret: 'keyboard cat',
resave: false,
saveUninitialized: false
}));
// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({ extended: false }))
app.use(bodyParser.json())
app.use(express.static(path.join(__dirname, 'public')));
//passportconfig
app.use(passport.initialize());
app.use(passport.session());
// used to serialize the user for the session
passport.serializeUser(function(user, done) {
done(null, user.id);
//
});
// used to deserialize the user
passport.deserializeUser(function(id, done) {
User.findById(id, function(err, user) {
done(err, user);
});
});
req.user
给你什么?尝试将其放入ensureLocalAuthenticated
I在ensureLocalAuthenticated
中添加了console.log(req.user)
。它返回未定义。在我尝试登录之后,这意味着passport无法加载用户。在passport.user
中,查看user
和req.cookies
的值。另外,您是否正在使用cookie解析器
?因为这将加载解析和加载cookie,passport将使用cookie加载用户。嘿,我找到了。这在app.js中丢失了。谢谢app.use(require('express-session')({secret:'keyboard cat',resave:false,saveUninitialized:false})代码>