如何保护Angular SPA网站?

时间:2013-11-24 03:14:58

标签: javascript performance security angularjs single-page-application

我的开发团队正在开始使用SPA网页,该网页仅通过WebAPI使用数据。以下是应该在网站上使用的技术:

  1. AngularJS - for SPA
  2. 承载令牌 - 后端安全性
  3. 我完成了我的作业并检查了几种保护页面的方法,其中一个是(1)有一个mainController与后端通信以验证用户,如果有效,则导航到目标页面,否则重新路由。但这里主要关注的是每个动作的通信/通信 - 数千个呼叫将对服务器进行身份验证。

    (2)另一种建议的方法是让一个setInterval()调用不时地验证用户的会话 - 一旦他/她已经登录。我想我已经在银行网站上观察到了这种行为。 / p>

    如果您有其他方式,您能否提出其他建议?

2 个答案:

答案 0 :(得分:3)

您正在制作SPA,因此我假设您要保护的所有内容(您的数据)都是通过您的WebAPI提供的,并且您可以将Angular模板公开。

在这种情况下,您基本上可以忽略客户端的身份验证,只需验证对WebAPI的调用。任何未经身份验证,未经授权或来自过期会话的服务器调用都会返回HTTP 401,Angular可以通过重定向到登录页面来响应。您可以使用HTTP拦截器来简化该代码(此处示例来自here)。

myapp.factory('myHttpResponseInterceptor',['$q','$location',function($q,$location){
  return {
    response: function(response){
      return promise.then(
        function success(response) {
        return response;
      },
      function error(response) {
        if(response.status === 401){
          $location.path('/signin');
          return $q.reject(response);
        }
        else{
          return $q.reject(response); 
        }
      });
    }
  }
}]);
//Http Intercpetor to check auth failures for xhr requests
myapp.config(['$httpProvider',function($httpProvider) {
  $httpProvider.interceptors.push('myHttpResponseInterceptor');
}]);

此外,如果您知道服务器端会话超时设置为20分钟,那么您还可以使用HTTP拦截器来跟踪上次HTTP请求的时间。比如19分钟前,你可以警告用户他们将在1分钟内注销,除非他们回应,在这种情况下你会调用“保持活动”服务来重置超时,否则在20分钟重定向到会话过期页面。所以不需要轮询。

为了获得更好的用户体验,在每次加载视图时,您可以对会话cookie的存在执行一些基本的客户端检查。如果它不存在(例如,它们已从深层链接登陆),那么您可以立即重定向到登录而无需调用服务器。如果它确实存在,则正常进行,知道第一次调用WebAPI将验证它。

答案 1 :(得分:1)

你可以像往常一样使用基于cookie的身份验证,在请求CSRF时使用基于cookie的令牌,并在cookie过期时清除两者,这里只添加的是angluarjs的响应处理方,如果发生auth错误,整页刷新。如果你已经在使用某种认证和csrf,那么在服务器端没有太大的改变。