如何使用passport.js和Angular重定向过期用户



一点背景:

  • 我使用Passport.js处理服务器端登录
  • 在单页应用程序的客户端使用角度路由

问题:

在我的服务器路由器中,我有中间件,可以确保用户在请求某些内容时登录,即:

function isLoggedIn(req,res,next){
    if(req.isAuthenticated()){
        return next();
    }
    res.render('index.ejs');
};

用于以下路线:

app.get('/SomethingForLoggedUsers', isLoggedIn, function(req,res){...

我的问题是,如果用户在网站上(由Angular路由器处理的部分),并且他们的会话已过期,则res.render('index.ejs');不起作用。我的感觉是,角度路由与没有显示index.ejs这一事实有关,但我无法解决这个问题。有什么建议吗?

您的解决方案的问题是,使用angular,用户可能正在执行一些客户端操作,而没有在服务器上发出请求。

在angular中,我看到了解决这个问题的两种常见方法:

在客户端上完全处理这个问题,有一个开源的ng idle指令可以帮助解决这个问题。当用户在客户端上超时时,您可以使用passport 将他们从应用程序中注销

在服务器的支持下处理这一问题,有一个开源的angular http auth模块可以帮助处理来自服务器的http 401/403。这意味着你的代码可以:

function isLoggedIn(req,res,next){
if(req.isAuthenticated()){
    return next();
}
    res.writeHead(401);
    res.end();
};

我希望这些信息能帮助你理解Angular中的可能。

以下是我解决问题的方法。

在我的角度控制器中,我有:

$http.get('/SomethingForLoggedUsers').success(function(data) {
if(!data.user)$window.location.href="/login";

在服务器中,每次用户未登录时,我都会返回user:null,即:

function isLoggedIn(req,res,next){
    if(req.isAuthenticated()){
        return next();
    }
    res.json({user:null});
};

相关内容

最新更新