验证逻辑 - 服务器与客户端

时间:2016-02-18 09:14:38

标签: angularjs express angular-ui-router

我试图了解身份验证逻辑应该存在于我的应用程序中的位置,我尝试采取的方法是让服务器处理任何身份验证责任,重定向到登录页面'与主客户端应用程序分开 - 我认为这是明智的吗?

我有一个angularjs应用程序,它使用ui-router并发出通过服务器路由的api请求。

我使用的Express服务器配置为使用如下几个目录:

app.use(express.static('./dist/client'));
app.use(express.static('public'));

然后我有中间件执行身份验证(我也使用快速会话)并在需要时重定向到登录。

//A request to '/login' will serve the login page
app.use('/login', function(req, res){
  res.sendFile(path.join(__dirname+'/public/login.html'))
});

//This will listen for all requests
app.use(function(req, res, next) {
  if (req.url!== '/auth/login' && !req.session.accessToken) {
    res.redirect('/login');
    return;
  }
  next();
});

在初始页面加载时,如果不存在会话cookie,则立即按预期重定向到登录视图。

登录后,主应用程序加载,如果我然后手动删除浏览器中的cookie并执行需要api请求的状态更改(处于状态解析),服务器将返回登录视图,但这会在内部呈现ui-router使用的ui-view组件,而不是服务器完全重定向到/login

此外,如果我导航到不执行api请求的页面(删除cookie之后),该页面将被回送,我想我的app.use中间件不会覆盖重定向。< / p>

我觉得我在这里遗漏了一些明显的东西,有人可以帮助我吗?

1 个答案:

答案 0 :(得分:1)

处理此问题的一种方法是:

如果用户未经过身份验证,请使API服务器返回401(未经授权)错误,而不是将其重定向到登录页面。

然后,在运行块中,向$stateChangeError添加$rootScope事件处理程序。这样,如果API请求来自未经身份验证的用户,则会触发事件处理程序。从那里,您可以将用户重定向到您的登录页面:

angular.module('myApp').run(function($rootScope, $window) {
  $rootScope.$on('$stateChangeError', function() {
    $window.location.href = '/login';
  });
});

我不确定是否有必要担心您删除Cookie并导航到不会发出任何API请求的网页。这样的用户会获得什么?在这个假设的场景中,他们已经在查看您应用中的页面(可能包含敏感数据)。他们是如何开始的?

您可以为$stateChangeStart事件使用类似的事件处理程序来检查Cookie是否存在,如果缺少则重定向。但是,您不想在您的客户端中放置验证cookie的代码,然后任何好奇的访问者都可以阅读该代码并了解如何创建cookie以欺骗您的服务器。