2014-01-30 184 views
2

我想爲我的Web應用程序開發RESTful API。客戶必須清楚JS + HTML,並且用戶必須以某種方式在系統中進行身份驗證。我讀過幾篇關於安全性和RESTful API的文章,但有些觀點仍然不清楚。正如我在第一步所理解的,用戶必須提供他的憑據給服務器。在該服務器必須驗證用戶證書並且它們是否有效之後,將一些編碼的令牌發送給用戶(假設它將是[用戶密鑰]:[用戶IP]:[令牌創建時間])。用戶認證客戶端必須在每次調用API時發送此密鑰。這就是我瞭解RESTful API身份驗證原理的方式。RESTful API安全

有了這樣的解決方案,我假設令牌可以被盜,另一個用戶可以訪問安全的用戶數據(即使IP包含在訪問令牌中,每個請求都會有驗證)。爲此,我計劃包括令牌創建時間,但正如我理解的這樣的解決方案,我必須在每次過期時更新訪問令牌 - 在這種情況下,我不清楚如何實現「記住我」功能。

我不清楚如何爲我的RESTful API實現100%安全認證。也許我錯過了一些東西。或者,也許我對認證principes的理解是錯誤的。

回答

2

這取決於您正在使用的身份驗證方案。例如,在ASP.NET MVC + REST中使用基本身份驗證進行處理時,它將爲您生成令牌,該令牌實際上是Base64編碼的字符串「{用戶名}:{密碼}」。而且你是對的,它可能被盜,這就是爲什麼基本認證HTTPS是必須的,因爲令牌用Basic模式拋出認證頭。

對於REST安全性,最合適和最安全的是OpenId和OAuth。只是不要重新發明輪子並使用已有的標準。與OpenID相比,OAuth不僅包含身份驗證,還包含授權。 OAuth已經用令牌更新和令牌創建時間等描述了所有的細微差別。

現在實際如何在REST中實現OAuth。首先閱讀標準。對於你的案例閱讀Implicit Grant flow,因爲標準有不同的客戶端具有不同的信任級別和安全性的多個流程。

http://tools.ietf.org/html/rfc6749

之後,你可以嘗試在技術堆棧的一些已經實施庫您使用的是Java或.NET。對於客戶端來說,使用庫進行比較並不重要,但對於服務器實施而言,

關於潛在的安全問題,請閱讀http://tools.ietf.org/html/rfc6749#section-10

Some think that OAuth 2.0 is less secure that OAuth 1.0,它也依賴於令牌格式。無論如何,訪問令牌應該通過HTTP頭傳遞,並通過HTTPS以及clientid應該存儲並通過安全。