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

时间:2014-11-12 20:16:20

标签: angularjs node.js angular-routing passport.js

一些背景知识:

  • 我使用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没有显示的事实有关,但我没有设法解决问题。有什么建议吗?

2 个答案:

答案 0 :(得分:1)

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

在角度方面,我已经看到了解决这个问题的两种常见方法:

在客户端完全处理这个问题,有一个开源的ng-idle指令可以帮助解决这个问题。当用户在客户端上超时时,您可以使用护照

将其登出应用程序

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

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

我希望这些信息可以帮助您了解Angular的可能性。

答案 1 :(得分:0)

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

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

$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});
};