【问题标题】:nodejs passport not logging out because of middleware由于中间件,nodejs护照没有注销
【发布时间】:2017-06-21 07:31:36
【问题描述】:

我正在使用 nodejs、express、mongoose 和 passport npm 制作一个 webapp。

之前我的登录和注销功能运行良好,但现在我必须添加一个功能来检查用户是高级用户还是普通用户。 所以我做了一个中间件,现在导致注销问题。 这是我的代码。

在我的 index.js 文件中,每秒都会调用 /matchData 上的 ajax 请求,以根据用户类型获取数据。

//ajax routes for json response
router.get('/matchData', isPremium);


//middleware causing problem
function isPremium(req,res,next){
    if(req.isAuthenticated()){
        if(req.user.type=='premium'){
            console.log("user is premium");
            Match.getMatchLatestData(function(err,match){
                if(err) throw err;
                res.send(match[0]);
            });
        }else{
            console.log("user is loggedin but not premium");
            Match.getMatchData(function(err,match){
                if(err) throw err;
                res.send(match[0]);
            });
        }
    }else{
        console.log("user not logged in");
        Match.getMatchData(function(err,match){
            if(err) throw err;
            res.send(match[0]);
        }); 
    }   
}

在我的 user.js 中,我的登录和注销功能如下

//Login Routes
router.get('/login',isAuthenticated2, function(req, res, next) {
  res.render('user/login',{
    title:'login'
  });
});

router.post('/login',isAuthenticated2, passport.authenticate('local',{failureRedirect:'/users/login', failureFlash:'Invalid Email Id or Password'}),function(req,res){
    console.log('Authentication Successful');
    req.flash('success','You are logged in.');
    res.redirect('/');
});

//logout route
router.get('/logout',isAuthenticated,function(req,res){
    req.logout();
    req.flash('success','You have logged out');
    res.redirect('/');
});

function isAuthenticated(req, res, next) {
    if(req.isAuthenticated())
        return next();
    else{
        req.flash('error','Please Login First')
        res.redirect('/users/login');   
    }

}

function isAuthenticated2(req, res, next) {
    if(req.isAuthenticated()){
        req.flash('info','You are already logged in.')
        res.redirect('/');  
    }
    else
        return next();
}

现在的问题是当我注销时它显示 flash msg 成功,但在我的控制台中它仍然显示我已登录但不是高级版或我是高级版,这是我登录的唯一情况。

【问题讨论】:

    标签: node.js express middleware passport.js


    【解决方案1】:

    不要使用req.logout()尝试使用下面的sn-p

    req.session.destroy(function (err) {
        res.redirect('/');
     });
    

    【讨论】:

    • 谢谢这解决了这个问题,也解决了另一个问题,退出后的返回按钮让我保持登录状态。
    • 还有一件事是如何使用 Flash 消息。现在 flash msg 导致错误 req.flash requires session 尽管我的 express 应用程序正在使用 express-session。 @Urvish
    • 1.退出后的返回按钮让我保持登录状态 - 每个页面上都必须有一个端点,您可以在其中检查用户是否登录。如果用户没有登录,那么它应该返回 401 或一些修复代码。在客户端代码上编写一个响应拦截器,如果任何响应返回 401,则将其重定向到登录页面。
    【解决方案2】:

    在节点中尝试此代码,我们在登录后为用户设置会话,销毁相同将注销用户

    //logout route
    router.get('/logout',function(req,res){
        req.session.user = '';
        res.redirect('/login'); // redirect wherever required
    });
    

    【讨论】:

      【解决方案3】:

      我有类似的问题,并从http://www.passportjs.org/docs/logout/找到答案

      app.get('/logout', function(req, res){
        req.logout();
        res.redirect('/');
      });
      

      或者如果你有一个注销页面。

         app.get('/logout', function(req, res){
          req.logout();
          res.render('logout', {
                   title: "Moi moi!"
               });
      
          });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-07
        • 2021-07-15
        • 2020-09-03
        • 2012-09-10
        • 2019-08-07
        • 2012-09-13
        相关资源
        最近更新 更多