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

Jak*_*rsh 14 javascript mongodb node.js express angularjs

我正在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令牌都将从数据库中删除,并且将不再有效.

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

Jak*_*rsh 8

我结束了我原来的工作流程快速的权威性例子,可见结合在这里.它如下:

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