2011-11-16 266 views
2

我需要爲RESTful體系結構實現身份驗證方案。從我讀過的幾篇文章中,包括使用HTTP的基本身份驗證和使用Cookie的會話管理。RESTful身份驗證方案

但是我不太瞭解cookie的使用。我的理解是用戶首先發送憑證。服務器檢查憑證是否正常。如果是,服務器會生成授權令牌並將其放入cookie中。隨後,在每個請求上,服務器檢查cookie中令牌的有效性。

但是,服務器如何知道cookie的內容是有效的。它存儲在某個地方,然後比較它?

回答

1

我不是專家,但是理解這個的好的起點是Hartl的書中的section on Sessions

如果我沒有弄錯,它的工作原理如下:
當令牌被創建時,它使用一個公式,例如:用戶名和唯一的用戶密鑰(鹽)一起加密。用戶名和鹽都存儲在數據庫中,鹽對該用戶是唯一的。因此,您可以像比較密碼是否匹配一樣來檢查cookie的有效性,然後重新創建令牌並將其與cookie中的令牌進行比較。如果匹配,則正確的用戶登錄並因此被授權。

希望這有助於,或者至少點你在正確的方向:)

+0

你是否認爲如果我們每次發送cookie中的令牌都會導致安全威脅? – Noor

+0

如上所述(在我的評論中),將令牌再次發送回服務器肯定是一個安全問題,應該通過使用HTTPS協議來最小化。 – sangupta

+0

嗯,我不知道我是否會將它用於銀行系統,但是如果每次登錄都使用一個唯一編號(例如時間戳)來創建令牌,即使有人盜取它,系統也不會允許「小偷」登錄,因爲時間戳會有所不同。所描述的方法在大多數情況下應該足夠安全。如果你有點偏執,試着在數據庫中保存一個會話而不是一個cookie。 –

3

這裏的關鍵點是授權令牌。當生成一個並返回給客戶端時,您將認證令牌和用戶名一起存儲,比如說一個數據庫。您將身份驗證令牌存儲在Cookie中。隨後的請求中的客戶端會向您發送包含身份驗證令牌的用戶名和cookie。您根據提供的用戶名驗證此令牌,然後根據需要執行操作。

但是,請注意,設置cookie會使您的web服務調用有狀態並且會影響REST的目的。

要實現身份驗證/授權,而不是在Cookie中設置授權令牌,請將其作爲響應值發回。客戶端讀取認證令牌的值,然後將每個REST請求中的值作爲請求主體的參數提供。因此,你不需要設置cookie。這可以稱爲基於OAuth的API訪問中實現的簡化版本。

+0

當服務器將令牌發送回客戶端時,客戶端將把它存儲在某個地方,但這不是冒險嗎?另外,如果每次我們將線路上的令牌傳送到服務器,是不是有人攔截請求的風險? – Noor

+1

客戶端將令牌存儲在內存中,並且與將任何其他值存儲在內存(或瀏覽器cookie)中一樣安全。 在網絡上傳輸令牌具有與傳輸Cookie相同的安全問題(如問題描述中所述)。 所有這些限制都已在基於OAuth的API訪問中考慮到了。它基本上暗示的是用SHA1/MD5簽名帶有認證令牌的請求參數,並將校驗和作爲另一個參數。由於服務器知道授權令牌,它可以重新計算校驗和並將其與提供的校驗和進行匹配。 – sangupta

+1

因此,身份驗證令牌不會傳輸回客戶端。只有用戶名和用令牌計算的校驗和一起提供。令牌可能受到危害的唯一地方是在授權期間從服務器到客戶端的傳輸過程中 - 因此,通過HTTPS使用它更安全。 – sangupta