2013-10-04 54 views
14

我正在開發一個關於MEAN棧(MongoDB,Express,AngularJS和node.js)的web應用程序。我正在開發一個登錄系統,並且還會保護一些Angular路由,以便只有登錄用戶才能訪問它們。我正在想辦法解決這個問題的最佳方式。MEAN棧上登錄系統的體系結構?

我想目前的工作流程:

  • 用戶通過AngularJS形式,它發送一個HTTP POST到Express端點登錄英寸端點根據數據庫驗證用戶,並使用OAuth令牌和Cookie進行響應。兩者都存儲在mongo數據庫中供以後驗證。
  • 一旦AngularJS收到登錄響應,它將使用ng-cookies存儲收到的cookie,並將OAuth令牌存儲在用戶服務中。
  • 現在,每當AngularJS中的路由發生變化時,User服務就會被用來確保cookie通過與mongo數據庫中的cookie進行比較來保持合法(這將是使用Angular解析的API調用)創建明顯的延遲?)
  • 當用戶單擊「註銷」或Cookie過期時,Cookie和OAuth令牌都將從數據庫中刪除,並且不再有效。

這種方法有意義嗎?它是否安全,並且執行起來是否相對有效/快速?

+1

有意義的是,您也可以使用會話,所以每次更改路由時都不檢查數據庫。 – tymeJV

+0

會話是否由Express管理?然後在路線上的變化,我仍然會進行API調用,但它不會檢查數據庫? – Jakemmarsh

+2

是的,'req.session' - 檢查這個帖子:http:// stackoverflow。com/questions/14218725/working-with-sessions-in-express-js - 或者您可以結帳HTML5'sessionStorage' – tymeJV

回答

8

我最終將我的原始工作流程與Express的身份驗證示例結合起來,看到here。如下所示:

  • 當用戶初次加載應用程序時,會對Express端點進行http調用,以檢查用戶是否已存在會話。如果是這樣,用戶被存儲在$rootScope並且被認爲已登錄。
  • 任何時候AngularJS路由改變,都會訪問同一個端點。路線保護以類似於here所述的方式指定。如果終端返回沒有會話存在,$rootScope.user未被設置(如果需要),並且用戶被重定向到登錄頁面。
  • 處理登錄表單後,它會發布到Express端點。端點從mongoDB中檢索用戶(如果存在),並嘗試散列密碼。如果匹配,則設置用戶的會話,存儲在mongo數據庫中,並且端點返回user對象(用於存儲在前面提到的$ rootScope中)。
  • 任何時候訪問任何進一步的端點,函數首先通過restrict函數傳遞,該函數確保在將任何數據發送到客戶端之前存在會話。如果沒有會話存在,則返回401,然後在使用this HTTP interceptor的Angular端處理它以取消設置$rootScope.user並重定向到登錄屏幕。
  • 當用戶在Angular端單擊「註銷」時,會話被取消設置並從mongo數據庫中刪除,$rootScope.user被設置爲空,並且用戶被重定向回首頁。