登录后重定向到受保护的页面(passport-local - express - nodejs)
redirect to a protected page after login (passport-local - express - nodejs)
我试图在 /login
之后显示受保护的页面 /enquete
(只有登录用户才能看到的页面)。我正在使用 passport-local 实现它。我已经检查了登录功能 returns 一个用户(req.isAuthorized()
是真的)并且它实际上试图去 /enquete
但是当试图访问 /enquete
时 req.isAuthorized()
是错误的。所以我无法访问它:(.
我想知道我在这里缺少什么?这是正确的做法吗?
这些是我的部分代码:
passport.use(new LocalStrategy(function (username, password, done) {
process.nextTick(function() {
model.findByUsername(username, function(err, user) {
if (err) { return done(err); }
if (!user) { return done(null, false, { message: 'Unknown user ' + username }); }
if (user.password != password) { return done(null, false, { message: 'Invalid password' }); }
return done(null, user); // <<-- I pass this so login was OK
});
});
}));
...
var app = express();
app.set('view engine', 'ejs');
app.use(less(path.join(__dirname, 'public')));
app.use(express.static(path.join(__dirname, 'public')));
app.use(cookieParser());
app.use(session({ secret: '123', resave: true, saveUninitialized: true }));
app.use(passport.initialize());
app.use(passport.session());
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(flash({ locals: 'flash' }));
...
app.post(
'/login',
passport.authenticate(
'local',
{ successRedirect: '/enquete', // <--- Please read below note on this
failureRedirect: '/login' }));
function ensureLocalAuthenticated(req, res, next) {
if (req.isAuthenticated()) { return next(); }
res.redirect('/login');
}
app.get(
'/enquete',
ensureLocalAuthenticated,
function(req, res) {
res.render('pages/enquete');
});
注:
我已经调试 passport.authenticate
以确保登录确实成功。因为我提供了 successRedirect
选项,所以 return res.redirect(options.successRedirect);
发生在 node_modules/passport/lib/middleware/authenticate.js:245
附近。我已经检查 req.isAuthorized()
在重定向之前确实是真的。
然而在ensureLocalAuthenticated
中req.isAuthorized
是错误的。为什么?!
我迷路了。感谢任何帮助
愚蠢但有道理。我发现原因是中间件的顺序不对! (捂脸)。将代码更改为此使我的服务器按预期工作。
var app = express();
app.set('view engine', 'ejs');
app.use(less(path.join(__dirname, 'public')));
app.use(express.static(path.join(__dirname, 'public')));
app.use(cookieParser());
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(session({ secret: '123', resave: true, saveUninitialized: true }));
app.use(flash({ locals: 'flash' }));
app.use(passport.initialize());
app.use(passport.session());
我试图在 /login
之后显示受保护的页面 /enquete
(只有登录用户才能看到的页面)。我正在使用 passport-local 实现它。我已经检查了登录功能 returns 一个用户(req.isAuthorized()
是真的)并且它实际上试图去 /enquete
但是当试图访问 /enquete
时 req.isAuthorized()
是错误的。所以我无法访问它:(.
我想知道我在这里缺少什么?这是正确的做法吗?
这些是我的部分代码:
passport.use(new LocalStrategy(function (username, password, done) {
process.nextTick(function() {
model.findByUsername(username, function(err, user) {
if (err) { return done(err); }
if (!user) { return done(null, false, { message: 'Unknown user ' + username }); }
if (user.password != password) { return done(null, false, { message: 'Invalid password' }); }
return done(null, user); // <<-- I pass this so login was OK
});
});
}));
...
var app = express();
app.set('view engine', 'ejs');
app.use(less(path.join(__dirname, 'public')));
app.use(express.static(path.join(__dirname, 'public')));
app.use(cookieParser());
app.use(session({ secret: '123', resave: true, saveUninitialized: true }));
app.use(passport.initialize());
app.use(passport.session());
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(flash({ locals: 'flash' }));
...
app.post(
'/login',
passport.authenticate(
'local',
{ successRedirect: '/enquete', // <--- Please read below note on this
failureRedirect: '/login' }));
function ensureLocalAuthenticated(req, res, next) {
if (req.isAuthenticated()) { return next(); }
res.redirect('/login');
}
app.get(
'/enquete',
ensureLocalAuthenticated,
function(req, res) {
res.render('pages/enquete');
});
注:
我已经调试 passport.authenticate
以确保登录确实成功。因为我提供了 successRedirect
选项,所以 return res.redirect(options.successRedirect);
发生在 node_modules/passport/lib/middleware/authenticate.js:245
附近。我已经检查 req.isAuthorized()
在重定向之前确实是真的。
然而在ensureLocalAuthenticated
中req.isAuthorized
是错误的。为什么?!
我迷路了。感谢任何帮助
愚蠢但有道理。我发现原因是中间件的顺序不对! (捂脸)。将代码更改为此使我的服务器按预期工作。
var app = express();
app.set('view engine', 'ejs');
app.use(less(path.join(__dirname, 'public')));
app.use(express.static(path.join(__dirname, 'public')));
app.use(cookieParser());
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(session({ secret: '123', resave: true, saveUninitialized: true }));
app.use(flash({ locals: 'flash' }));
app.use(passport.initialize());
app.use(passport.session());