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回到首页。