req.isAuthenticated() 改变重定向?

req.isAuthenticated() changes on redirect?

  1. 用户提交登录POST数据。 passport.js 验证。 req.isAuthenticated()true.
  2. 将用户从登录路径重定向到主页
    • 在主页路线中,req.isAuthenticated() 现在是 false
    • 重新加载主页(浏览器 GET)。现在主页 req.isAuthenticated() 读取 true 并在后续请求中保持 true 直到注销。

我会说,这种情况大约有 80% 的时间会发生。其他 20%,hompage req.isAuthenticated() 在重定向和后续重新加载时 true

我找到了一个 ,但我认为答案似乎并不像评论所指出的那样正确,因为在我的设置中,后续请求在注销之前得到了正确的身份验证。

router.post('/sign_in', (req, res) =>
{
    passport.authenticate
    (
        'local',
        (err, user, info) =>
        {
            if(!err && user)
            {
                req.logIn(user, (err) =>
                {
                    if(!err)
                    {
                        console.log('s', req.isAuthenticated()); // <-- true
                        res.setHeader('Cache-Control', 'no-cache');
                        return res.redirect('/');
                    }
                });
            }
        }
    )(req, res);
}

并且:

router.get('/', async (req, res) =>
{
   console.log('h', req.isAuthenticated()); // <-- false ???
   res.send();
}

如果重要的话,我的会话设置如下所示:

app.use
(
    session
    ({
        store             : //...
        secret            : process.env.SESSION_SECRET,
        resave            : false,
        saveUninitialized : true,
        cookie            :
        {
            httpOnly : false,
            secure   : false,
            maxAge   : null
        }
    })
);

如何解决这个问题?

问题似乎是由错误引起的。参见:

解决方法是在重定向之前保存会话。

req.session.save(() =>
{
    return res.redirect('/');
});