14

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

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

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

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

4

1 回答 1

8

我最终将我的原始工作流程与 Express 的身份验证示例相结合,参见此处。如下:

  • 当用户最初加载应用程序时,会对 Express 端点进行 http 调用,以检查用户是否已经存在会话。如果是这样,则用户被存储$rootScope并被视为已登录。
  • 每当 AngularJS 路由发生变化时,都会访问同一个端点。路由保护的指定方式与此处描述的类似。如果端点返回不存在会话,$rootScope.user则未设置(如果需要),并且用户被重定向到登录页面。
  • 处理登录表单后,它会发布到 Express 端点。端点从 mongoDB 中检索用户(如果存在),并尝试对密码进行哈希处理。如果匹配,则设置用户的会话,存储在 mongo DB 中,并且端点返回user对象(如前所述,用于存储在 $rootScope 中)。
  • 每当访问任何其他端点时,函数首先通过该restrict函数传递,以确保在向客户端发送任何数据之前存在会话。如果不存在会话,它会返回一个401,然后在 Angular 端使用此 HTTP 拦截器进行处理,以取消设置$rootScope.user并重定向到登录屏幕。
  • 当用户在 Angular 端单击“注销”时,会话未设置并从 mongo DB 中删除,$rootScope.user设置为 null,并且用户被重定向回首页。
于 2013-10-06T18:52:49.323 回答