2013-10-08 71 views
2

我想在我的應用程序中使用RESTfull認證API。想象一下以下結構:設計一個RESTful認證API

創建一個新的會話令牌(登錄):

POST /session/?username=&password <-- return session token 

使用令牌更新,並得到一個受保護的ressource:

PUT /ressource/example?token={token} 
GET /ressource/example?token={token} 

刪除令牌(註銷):

DELETE /session/{token} 

問:這是一個PI RESTfull?如果不是,我該怎麼辦?

+0

A /爲什麼不使用HTTP認證? b /爲什麼不使用會話cookie,它位於http標題中,不需要出現在你的url中? – njzk2

+0

請檢查這個答案,看看是否有幫助。 [這裏](http://stackoverflow.com/questions/19010067/restful-login-proper-implementation/19024952#19024952) – Satish

回答

3

身份驗證和會話是很少真正RESTful的區域,因爲它們是有狀態的,除非您爲每個請求傳遞完整的身份驗證憑證。

這是我做的,和你的相似,只有一個很大的區別。

POST /session/ --> creates a session, passing credentials in HTTP Auth Header 

如果成功,以及會話ID,就像真實資源一樣,上面將返回201。它還包含Cookie中的會話令牌(以及特殊的X-類型的HTTP標頭),可用於每個後續請求中。

GET /protectedResource --> includes the credential in the HTTP header 

並終止/無效會話,這是一個常見的活動,如點擊「註銷」

DELETE /session/sessionId 

從你做了什麼,唯一真正的區別是,我會從未在查詢路徑或主體中傳遞令牌和憑證。唯一的例外是如果你想做基於表單的認證並提交,但即使如此,當我可以的時候,我更喜歡處理Web端並提交爲標題。

的原因是2倍:

  1. 你希望能夠揭露URL不會暴露任何祕密
  2. 你希望能夠重複使用的URL不暴露

HTTP auth的另一個優點是(它在頭文件中)是它變得很容易使用curl來測試你的REST API:

curl --user username:pass http://server/protectedResource 

而且你甚至可以生成會話令牌並在curl中使用它們。

如果你是舒服的NodeJS,你可以看一下README和源代碼cansecurity http://github.com/deitch/cansecurity

0

也許你應該遵循一個稍微不同的方式,以 「讓用戶令牌」(或身份驗證令牌):

POST /認證/ {用戶名}(在HTTP頭中的密碼)

或類似的東西,這個想法是,你想要的「資源」是特定用戶的「令牌」或「身份驗證令牌」。您使用的POST不是非常「RESTful」,因爲您在資源「會話」上張貼,所以它可能是「會話的詳細信息」...

關於PUT/GET,我認爲這似乎是「正確的」,即您在每個請求中發送令牌以對「資源」進行操作。

關於DELETE,我不確定這是否會發生......這可能是您在服務器(Web服務)邏輯中定義的東西,例如:令牌的TTL。我不認爲「客戶端」應該能夠刪除令牌,但也許你有其他一些要求。

只是最後一次提醒,要非常小心地以「純文本」使用它,即始終通過加密通道(例如:HTTPS)在HTTP標頭中發送此信息(密碼和令牌)。此外,有幾種方法(如HTTP基本認證)已經實現了這種認證,你應該看看它們。