一点背景:
- 我使用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});
};