我正在 MEAN 堆栈(MongoDB、Express、AngularJS 和 node.js)上开发一个 Web 应用程序。我正在开发一个登录系统,并且还将保护一些 Angular 路由,以便只有登录的用户才能访问它们。我正在尝试思考实现此架构的最佳方法。
我正在考虑当前的工作流程:
- 用户通过 AngularJS 表单登录,该表单将 http POST 发送到 Express 端点。端点根据数据库验证用户,并使用 OAuth 令牌和 cookie 进行响应。两者都存储在 mongo 数据库中以供以后验证。
- 一旦 AngularJS 收到登录响应,它就会使用 ng-cookies 存储收到的 cookie,并将 OAuth 令牌存储在用户服务中。
- 现在,每次 AngularJS 中的路由发生变化时,用户服务都会通过将 cookie 与 mongo 数据库中的 cookie 进行比较来确保 cookie 仍然合法(这将是使用 Angular 解析的 API 调用...这会产生明显的影响吗?落后?)
- 当用户单击“注销”或 cookie 过期时,cookie 和 OAuth 令牌都会从数据库中删除,并且不再有效。
这种方法有意义吗?它安全吗?执行起来相对高效/快速吗?
我最终将我的原始工作流程与 Express 的身份验证示例结合起来,看到了here https://github.com/visionmedia/express/blob/master/examples/auth/app.js。如下:
- 当用户最初加载应用程序时,将对 Express 端点进行 http 调用,以检查用户是否已存在会话。如果是这样,用户将存储在
$rootScope
并视为已登录。
- 每当 AngularJS 路由发生变化时,都会访问相同的端点。路由保护的指定方式与所描述的类似here http://blog.brunoscopelliti.com/deal-with-users-authentication-in-an-angularjs-web-app。如果端点返回不存在会话,
$rootScope.user
未设置(如果需要),并且用户将被重定向到登录页面。
- 处理登录表单后,它会发布到 Express 端点。端点从 mongoDB(如果存在)检索用户,并尝试对密码进行哈希处理。如果匹配,则设置用户会话,并将其存储在 mongo DB 中,并且端点返回
user
对象(用于存储在 $rootScope 中,如前所述)。
- 每当访问任何其他端点时,这些函数都会首先通过
restrict
在向客户端发送任何数据之前确保会话存在的功能。它返回一个401
如果不存在会话,则在 Angular 端使用这个HTTP拦截器 https://github.com/witoldsz/angular-http-auth取消设置$rootScope.user
并重定向到登录屏幕。
- 当用户在 Angular 端单击“注销”时,会话将被取消设置并从 mongo DB 中删除,
$rootScope.user
设置为 null,用户将被重定向回首页。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)