MEAN栈上login系统的体系结构?

我正在MEAN堆栈(MongoDB,Express,AngularJS和node.js)上开发Web应用程序。 我正在开发一个login系统,并且还会保护一些Angular路由,以便只有login用户才能访问它们。 我正在想办法解决这个问题的最佳方式。

我正在考虑当前的工作stream程:

  • 用户通过AngularJS表单login,该表单将http POST发送到Express端点。 端点根据数据库validation用户,并使用OAuth令牌和cookie进行响应。 两者都存储在mongo数据库中供以后validation。
  • 一旦AngularJS收到login响应,它将使用ng-cookies存储收到的cookie,并将OAuth令牌存储在用户服务中。
  • 现在,每当AngularJS中的路由发生变化时,用户服务将通过将它与mongo数据库中的cookie进行比较来确保cookie仍然是合法的(这将是使用Angular的解决scheme进行的API调用…是否会创build一个明显的落后?)
  • 当用户点击“注销”或Cookie过期时,Cookie和OAuth令牌都将从数据库中删除,并且不再有效。

这种方法有意义吗? 它是否安全,执行起来会相对有效还是快?

我结束了我的原始工作stream程与Express的身份validation示例,看到这里 。 具体如下:

  • 当用户初次加载应用程序时,对Express端点进行http调用,该端点检查用户是否已经存在会话。 如果是这样,用户存储在$rootScope并考虑login。
  • 任何时候AngularJS路由都会改变,访问同一个端点。 路线保护以类似于这里描述的方式被指定。 如果端点返回时没有会话存在, $rootScope.user被取消设置(如果需要的话),并且用户被redirect到login页面。
  • 当处理login表单时,它会发送到一个Express端点。 端点从mongoDB中检索用户(如果存在),并尝试散列密码。 如果匹配,则设置用户会话,存储在mongo数据库中,并且端点返回user对象(用于存储在前面提到的$ rootScope中)。
  • 任何时候访问任何进一步的端点,函数首先通过restrict函数传递,这确保了在将任何数据发送到客户端之前存在会话。 如果没有会话存在,它将返回一个401 ,然后在Angular端使用这个HTTP拦截器来处理$rootScope.user并redirect到login屏幕。
  • 当用户在Angular端单击“注销”时,会话被取消设置并从mongo数据库中删除, $rootScope.user被设置为空,并且用户被redirect回到首页。