設計REST API時,通常先驗證用戶身份?在不重新發明輪子的情況下保護REST API
我要找的典型使用情況是:
- 用戶希望得到的數據。當然很酷,我們喜歡分享!獲取一個公共API密鑰並閱讀!
- 用戶想要存儲/更新數據......哇等等!你是誰,你能做到嗎?
我想構建一次,並允許說一個網絡應用程序,Android應用程序或iPhone應用程序來使用它。
一個REST API似乎是這樣
要求要說明我的問題,我會用一個簡單的例子,一個合乎邏輯的選擇。
我有一個數據庫中的項目,它有一個評分屬性(整數1到5)。
如果我理解REST正確我會實現使用我選擇的返回CSV,XML或JSON這樣的語言GET請求:
http://example.com/product/getrating/{id}/
說我們挑JSON我們返回:
{
"id": "1",
"name": "widget1",
"attributes": { "rating": {"type":"int", "value":4} }
}
這對於面向公衆的API來說很好。我得到那部分。
我在哪裏有很多問題,我該如何將它與安全模型相結合?我習慣了網絡應用程序的安全性,我有一個會話狀態隨時可以識別我的用戶,所以我可以控制他們可以做什麼,無論他們決定發送給我什麼。據我瞭解,這不是RESTful,所以在這種情況下將是一個不好的解決方案。
我會嘗試使用另一個使用相同項目/評級的例子。
如果用戶「JOE」想要一個評級添加到項目
這可以通過使用來完成:
http://example.com/product/addrating/{id}/{givenRating}/
在這一點上我想存儲的數據說「 JOE「給出了產品{id}的評分{givenRating}。
問:我怎麼知道請求來自「JOE」而不是「BOB」。
此外,如果是用戶的電話號碼等更明智的數據呢?
到目前爲止,我已經得到了什麼是:
1)使用內置的HTTP的功能,在每個請求進行身份驗證,無論是普通的HTTP或HTTPS。
這意味着,每一個要求,現在採取的形式是:
https://joe:[email protected]/product/addrating/{id}/{givenRating}/
2)使用諸如亞馬遜的S3與私人和公共密鑰的方法:http://www.thebuzzmedia.com/designing-a-secure-rest-api-without-oauth-authentication/
3)仍要使用一個Cookie,並打破REST的無狀態部分。
第二種方法對我來說似乎更好,但我還是想知道我是否真的必須重新創造這整個事情?散列,存儲,生成密鑰等都由我自己?
這聽起來很像在典型的Web應用程序中使用會話並且自己重寫整個堆棧,通常我的意思是「你做錯了」,特別是在處理安全性時。
編輯:我想我應該提到OAuth以及。
如果您發送每個請求的用戶名和密碼,請使用HTTPS **。 –
與安全無關,但RESTful API不會使用'getrating'和'andrating';它只是「評級」,你會GET,POST,PUT或DELETE到該資源。 – Duncan