使用passport.js限制页面访问并表达中间件

时间:2018-01-13 23:53:49

标签: javascript node.js express authentication passport.js

我设置了一个服务器来验证用户登录,到目前为止,我能够成功验证用户身份并将其重定向到成功页面(如果失败则将其重定向回登录页面)。但是,如果用户未登录,我无法使用自己的快速中间件来限制用户,出于某种原因,中间件中的req.isAuthenticate()检查始终为false。登录时我觉得我的会话信息没有存储,但我不确定。

以下是我的设置(请注意,我使用的是express-flash-2而不是connect-flash因此req.flash()

在server.js

// ...
var flash = require('express-flash-2');
var session = require('express-session');
var passport = require('passport');
// ...

server.use(session({
    secret: 'keyboard cat',
    resave: true,
    saveUninitialized: true
}));
server.use(flash());
server.use(passport.initialize());
server.use(passport.session());

passport.use(auth_controller.authStrategy);
passport.serializeUser(auth_controller.authSerializer);
passport.deserializeUser(auth_controller.authDeserializer);

server.get('/maintenance_login', (req, res) => {
    res.render('login');
});
server.post('/maintenance_login', passport.authenticate('local', {
    successRedirect: '/maintenance',
    failureRedirect: '/maintenance_login',
    failureFlash: true
}));

// This does basically the same as above
// server.post('/maintenance_login', (req, res, next) => {
//     passport.authenticate('local', function(err, user, info) {
//         if (err) { return next(err); }
//         if (!user) { return res.redirect('/maintenance_login'); }
//
//         req.logIn(user, function(err) {
//             if (err) { return next(err); }
//             console.log('is authenticated?: ' + req.user); // this returns true
//             return res.redirect('/maintenance');
//         });
//     })(req, res, next);
// });

server.get('/maintenance:query?', auth_controller.restrict, maintenance_controller.maintenance_list);

在auth_controller.js

var passport = require('passport');
var LocalStrategy = require('passport-local');

var User = require('../models/user');

exports.authStrategy = new LocalStrategy({
    usernameField: 'email',
    passwordField: 'password'
}, function (email, password, done) {
    User.authenticate(email, password, function(err, user) {
        // success message

        // error message
        done(err, user, err ? { message: err.message } : null);
    });
});

exports.authSerializer = function(user, done) {
    done(null, user.id);
};

exports.authDeserializer = function(id, done) {
    User.findById(id, function(err, user) {
        done(err, user);
    });
};

exports.restrict = function (req, res, next) {
    console.log('is authenticated?: ' + req.isAuthenticated()); // This always returns false
    if (req.isUnauthenticated()) {
        res.flash('error', 'Access denied, please log in.');
        return res.redirect('/maintenance_login');
    }
    return next();
}

同样,我的问题是,每当我成功登录时,我都会被踢回/maintenance_login并且闪光灯会显示"Access denied, please log in."。这意味着限制中间件中的req.isUnauthenticated()返回true

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

嗯,事实证明错过.Strategy至关重要。将var LocalStrategy = require('passport-local');更改为var LocalStrategy = require('passport-local').Strategy;可解决此问题。任何其他人都有同样的问题。