护照+Express V4 req.user未定义。

3

我使用模块passport创建身份验证并带有会话。但是自从express v4以来,没有更多的教程了,并且我的身份验证无法正常工作。实际上,在验证用户是否已经通过身份验证的函数中,req.user始终为未定义,并且req.isAuthenticated为false!

exports.ensureAuthenticated = function(req, res, next) {    
  if (req.isAuthenticated()) { return next(); }
  res.redirect('/login');
}

app.use(connect.logger('dev')); 
app.use(express.static('public'));
app.use(connect.cookieParser());
app.use(bodyParser());
app.use(connect.cookieSession({ secret: 'keyboard cat', cookie: { secure: true }})); 
app.use(passport.initialize());
app.use(passport.session());

有什么解决方案吗?
2个回答

7
护照与Express 4完美配合。

当我尝试使用Angularjs时,也遇到了同样的问题,结果发现用户根本没有登录。 你的passport.serializeUserpassport.deserializeUser函数被调用了吗? 如果是这种情况,你是否使用自定义回调函数? 在跟随一个没有使用Angularjs的教程时,我不得不使用自定义回调函数:
    router.post('/login', function (req, res, next) {
        passport.authenticate('local-login',  function (err, user, info) {
            if (err) {
                return next(err); // will generate a 500 error
            }
            if (!user) {
                return res.send({ success : false, message : info.message || 'Falha no login' });
            }

            req.logIn(user, function(err) {
                if (err) { return next(err); }
                return res.send({ success : true, message : 'Login efetivado com sucesso', user: user });
            });

            //return res.send({ success : true, message : 'Login efetivado com sucesso', user: user });
        })(req, res, next);
    });

我没有调用 req.logIn,因此用户从未序列化/反序列化,req.isAuthenticated() 一直为 false。

1
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - jpierson

5

如果您的cookie.secure设置为true,而您又没有使用SSL(即https协议),那么带有会话ID的cookie将不会返回给浏览器,并且一切都会静默失败。删除此标志解决了我的问题。

app.use(session({ 
    secret: 'something', 
    cookie: { 
        secure: true
}}));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接