MEAN堆栈上登录系统的体系结构?

时间:2013-10-04 15:39:14

标签: javascript node.js mongodb angularjs express

我正在MEAN堆栈上开发一个Web应用程序(MongoDB,Express,AngularJS和node.js)。我正在开发一个登录系统,并且还会保护一些Angular路由,以便只有登录用户才能访问它们。我正在尝试考虑采用这种架构的最佳方法。

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

  • 用户通过AngularJS表单登录,该表单将http POST发送到Express端点。端点根据数据库验证用户,并使用OAuth令牌和cookie进行响应。两者都存储在mongo数据库中以供以后验证。
  • 一旦AngularJS收到登录回复,它就会使用ng-cookies存储收到的cookie,并将OAuth令牌存储在用户服务中。
  • 每次AngularJS中的路径发生变化时,用户服务用于通过将cookie与mongo数据库中的cookie进行比较来确保cookie仍然合法(这将是使用Angular解析的API调用...这样造成明显的滞后?)
  • 当用户点击“退出”或Cookie过期时,Cookie和OAuth令牌都会从数据库中删除,并且将不再有效。

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

1 个答案:

答案 0 :(得分:8)

我最终将我原来的工作流程与Express的auth示例结合起来,见here。它如下:

  • 当用户最初加载应用程序时,会对Express端点进行http调用,以检查用户是否已存在会话。如果是,则用户存储在$rootScope中并被视为已登录。
  • 每当AngularJS路线发生变化时,都会访问相同的端点。路线保护的方式类似于here所述的方式。如果端点返回不存在会话,则取消设置$rootScope.user(如果需要),并将用户重定向到登录页面。
  • 处理登录表单时,会将其发布到Express端点。端点从mongoDB(如果存在)中检索用户,并尝试散列密码。如果匹配,则设置用户的会话,存储在mongo DB中,并且端点返回user对象(用于存储在$ rootScope中,如前所述)。
  • 每次访问任何其他端点时,函数首先通过restrict函数传递,该函数确保在向客户端发送任何数据之前存在会话。如果没有会话,则返回401,然后使用this HTTP interceptor在Angular端处理,以取消设置$rootScope.user并重定向到登录屏幕。
  • 当用户点击Angular端的“注销”时,会话被取消设置并从mongo DB中删除,$rootScope.user被设置为null,用户被重定向回到首页。