【问题标题】:Restricting page access with passport.js and express middleware使用 passport.js 和 express 中间件限制页面访问
【发布时间】:2018-06-23 01:08:00
【问题描述】:

我设置了一个服务器来验证用户登录,到目前为止,我能够成功验证用户并将他们重定向到成功页面(如果失败,也将他们重定向回登录页面)。但是,如果用户未登录,我不能使用我自己的快速中间件来限制用户,由于某种原因,我在中间件中的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

有什么想法吗?

【问题讨论】:

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


    【解决方案1】:

    好吧,事实证明缺少.Strategy 是至关重要的。将 var LocalStrategy = require('passport-local'); 更改为 var LocalStrategy = require('passport-local').Strategy; 可解决此问题。以防其他人遇到同样的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-28
      • 2023-03-15
      • 2016-05-16
      • 2011-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-06
      相关资源
      最近更新 更多