登录后重定向到受保护的页面(passport-local - express - nodejs)

redirect to a protected page after login (passport-local - express - nodejs)

我试图在 /login 之后显示受保护的页面 /enquete(只有登录用户才能看到的页面)。我正在使用 passport-local 实现它。我已经检查了登录功能 returns 一个用户(req.isAuthorized() 是真的)并且它实际上试图去 /enquete 但是当试图访问 /enquetereq.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() 在重定向之前确实是真的。

然而在ensureLocalAuthenticatedreq.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());