2015-06-14 51 views
0

我正在創建一個Angular應用程序,並且我無法圍繞正確的方式來保證我的應用程序及其用戶的安全。保護角度應用程序

我一直在閱讀上許多棧的討論,但我相信我的思念發生了什麼事的一些核心的理解,請糾正你看到下面寫的任何錯誤。

到目前爲止,我有很多(目前主要是假設的)資源路由的西納特拉服務器。用戶可以使用電子郵件地址和密碼創建一個帳戶,該電子郵件地址和密碼在與BCrypt進行哈希處理之後存儲在數據庫中。用戶登錄時,通過電子郵件從數據庫中檢索記錄,並檢查密碼以進行身份​​驗證。從這一點我不確定如何繼續。

在此之前,我只是設置一個會話變量並有服務器檢查該變量,以便存在正確路線在用戶登錄。現在我的應用程序(當前)是一個單獨的HTML頁面,它使用Angular和ui-router來顯示不同的內容,所以大部分請求都只是返回JSON內容。

這是我的理解是RESTful應用程序一般不應使用會話,或者更確切地說,服務器應該相同,以相同的請求並沒有塑造一個響應自己的數據。 但是,如果我不在會話變量中存儲某些內容,服務器如何知道發出請求的客戶端具有正確的權限?而且會話還沒有存儲在瀏覽器中,因此不是服務器的一部分?

我從我已閱讀相信,就可以創建令牌基本上是一個大的隨機字符串,該字符串返回到客戶端,也將其存儲在一個時間戳的數據庫。然後,客戶端在提出請求時提供此令牌,並且服務器命中數據庫以驗證其是否存在並且有效。但客戶端是否也必須將該字符串存儲在cookie中?我猜想角度應用程序可以將令牌存儲在一個變量中,該變量在使用ui-router時會持續存在,但如果用戶使用地址欄導航則不會。

我也不明白基本身份驗證可能會或可能不適合這張圖片。任何幫助將不勝感激,並指向一些優秀的資源,我可能會更好地理解這些概念。

回答

1

你想閱讀JWT。有用於RubyAngular的JWT庫。

我知道你並沒有爲你的後端使用Node,但是看到所有協同工作的一個非常簡單的方法是運行Yeoman生成器angular-fullstack。它使用JWT,代碼很容易遵循。

+0

謝謝我會研究它 – ErikAGriffin

+0

這正是我所期待的,文章也澄清了會話/ cookies。謝謝。 – ErikAGriffin

0

您錯過了REST概念的要點。 REST API中的一個主要概念是服務器應該是無狀態的 - 這意味着您不應該在您的Web服務器中存儲會話或其他「狀態」。每個HTTP請求都完全隔離。每個請求都應包含服務器完成請求所需的所有數據。

但如果我不是存儲在一個會話變量,怎麼可能 服務器知道發出請求的客戶端有正確的 權限?

您可以存儲請求範圍的變量。這意味着它們應該只在相同的請求期間纔有效。您可以將當前登錄的用戶存儲在請求範圍變量中。這樣,您可以在調用業務方法時獲取當前用戶。我不熟悉西納特拉,但這裏是文檔:http://www.sinatrarb.com/intro.html#Request/Instance%20Scope

但客戶端不會也必須將該字符串存儲在cookie中嗎?

當然可以儲存您的訪問令牌在客戶端 https://stormpath.com/blog/where-to-store-your-jwts-cookies-vs-html5-web-storage/

爲@Andy加斯克爾建議看看JWT和fullstack應用代碼生成器,忘了基本身份驗證,因爲它是真正的「基本」。

更多有用的鏈接:

If REST applications are supposed to be stateless, how do you manage sessions?

http://www.sitepoint.com/php-authorization-jwt-json-web-tokens/

+0

「這意味着你不應該將會話或其他'狀態'存儲在你的Web服務器中」。會話存儲在客戶端瀏覽器中,但對嗎?您指的是存儲在服務器中的什麼狀態 – ErikAGriffin

+0

不是,會話存儲在Web服務器中。 –

1

據我所看到的,無論你是用你的會話做可以工作得很好。

這可以從服務器樣本JSON響應的情況下,用戶不loged:

{ 
"errorCode": 1, 
"error": "User not logged in", 
"data": {} 
} 

您可以設置自己的錯誤代碼和處理你想要做什麼。只有在用戶登錄後纔會發送任何數據。對於所有不需要驗證的頁面,您可以將數據設置爲任何您想要的。

在angularJS方面,您可以根據錯誤代碼進行處理,您可以將用戶重定向到登錄頁面等等。

在多個平臺上支持相同的替代方法是使用基於令牌的方法。用簡單的話來說,基於令牌的方法就是這樣工作的

  1. 用戶第一次用他/她的憑證登錄。
  2. 服務器驗證這些信息並創建服務器能夠從中解碼用戶標識的令牌。
  3. 每當客戶端發出請求時,它就會在每個請求中傳遞它的標記。
  4. 由於服務器可以解碼來自令牌的用戶信息,因此它根據是否是正確的令牌來發送或不發送數據。
  5. 令牌取決於一個祕密值。對於所有用戶而言,它們可以相同,也可以根據您希望實施的方式而不同。

這是所有做,你可以看看 http://jwt.io/

正如@提到安迪 - 加斯克爾,你可以看看 http://angular-tips.com/blog/2014/05/json-web-tokens-introduction/

我在解釋非常糟糕。請讓我知道這是否沒有任何意義。