2014-10-03 22 views
0

我想開發一個帶有可重用API和REST風格的網站,其中一個應該很好。讓我們說,每個用戶都可以存儲他們喜歡的書的信息。所以我有很多用戶,他們每個人都可以有很多書。用於用戶數據的RESTful API

正如我想象,我會通過某種要求如下得到的書籍列表:

GET /book 

不過。

用戶應該只列出他的書籍,而不是所有的書籍都存儲在服務器上。那麼如何正確地做到這一點?

在我閱讀了很多SO Q & A之後,似乎並沒有RESTful來利用cookie和會話id的標準認證(就像它在PHP或其他平臺上常見的那樣),因爲它保留了服務器上的狀態。 然後,第一個請求(GET/book)不會返回任何結果(用戶未登錄),並且在記錄之後,它將返回此用戶書籍的列表。

另一種解決方案我碰到,是追加憑據每一個要求,如:

GET /book?user=john&pass=1234 

儘管TLS(HTTPS)的這一要求(因爲明文數據)的,它只是似乎是錯誤的。好像冗餘,帶寬浪費,每個請求驗證等

我的問題是:

如果我沒看錯的,如何做到這一點的好方法?從良好的編程角度和性能/網絡使用情況兩方面來看,都是如此?

也許REST不適合用戶擁有的數據?

編輯: OAuth和類似的解決方案似乎太複雜了(他們也增加了開銷,我想?)。

+1

那麼這樣的url GET/users/books/{userId}'怎麼辦?如果你想做一些驗證,請不要**在URL中傳遞憑證,只需在成功登錄後創建一些哈希值並將其存儲在用戶的Cookie中即可。 – 2014-10-03 12:12:21

+0

是的,建立一個認證路由(/ login?),然後將認證保存在一個cookie中(或者在客戶端通過它的令牌時接受一個特殊的頭部)。 – 2014-10-03 12:14:12

+0

@GrzesiekD。以及如何防止某人不讀他的書? – Mios 2014-10-03 12:18:04

回答

1

您可以添加第一個必需的REST方法來獲取身份驗證令牌,以便您可以在所有其他REST請求中請求此令牌並使用它來過濾結果。

+0

這與cookie中使用$ _ ['SESSION']和會話ID有什麼不同? – Mios 2014-10-03 12:20:14

+0

好吧,與cookie的區別很明顯:不是每個人都需要/支持cookies。從會話中,您不必依靠容器身份驗證。我知道這很快,很髒,但這是一個答案。 :-) – Leo 2014-10-03 12:22:10

+0

我只是提出這個建議,因爲這是我在許多公開的REST API中看到的解決方案。 – Leo 2014-10-03 12:23:37

0

使用授權標頭傳遞憑證信息。如果OAuth是太複雜了,使用基本身份驗證通過SSL ......像這樣:

GET /user HTTP/1.1 

Authorization: Basic ZmlkZGxlcnBpYW5pc3Q6aGVsbG93b3JsZA== 
Accept: application/json 
(other headers here) 

雖然我肯定會推薦這是唯一的用戶一個URL,比如這個:

GET /users/fiddlerpianist/books HTTP/1.1 

請注意,在無狀態的RESTful服務中,沒有登錄或註銷的概念。每個請求都會從客戶端傳遞授權標頭。