2012-07-18 67 views
1

我想設計用於身份驗證和賬戶管理的REST服務。請讓我知道以下是否滿足REST風格。REST用於身份驗證的服務設計

POST http://server/security/authenticate?username=xxx&password=yyy 
POST http://server/security/forgotPassword?username=xxx&email=yyy 
PUT http://server/security/changePassword?oldPassword=xxx&newPassword=yyy 

無論HTTP POST方法PUT &是正確的嗎?由於認證不會修改任何內容,在這裏使用GET更好嗎?我很困惑。

回答

5

不要這樣做。不要出於任何原因將密碼放入URL中。

在這種情況下,我對你想要做什麼感到有點困惑 - 一般來說,REST API中的認證/授權不是由資源本身來處理,但是如果你設計了一個單獨的認證API,也許這是有道理的。簡單的答案是,將認證數據放在請求的正文中,並通過SSL發送。所以

POST https://server/security/changePassword/ 

,並在體內的數據。並確保用戶必須在您的服務內進行身份驗證!

從REST設計的角度來看,可以將POST看作是對主體執行操作的服務。理想情況下,使用創建/修改資源的URL以200/201狀態和位置標題進行響應。

當URL(而不是查詢參數)包含要創建資源的位置時,將使用PUT。

可以說,這將是一個寧靜的動做

GET https://server/security/{username}/{email}/forgottonPassword/ 

但是這是一個有點濫用......與職位堅持。

如果您嘗試對您的資源進行身份驗證,那麼Authorization標頭(錯誤名稱,但要使用的標頭)就是這些標籤的位置。

標準寧靜的方式做在這種情況下,用戶名/密碼認證被稱爲Basic Authentication

4

建模時,你認爲在資源REST風格的服務。該資源是user。您想要公開的服務(因爲在服務中思考而強制使用RPC樣式)會進行身份驗證並獲取一個安全令牌,稍後可以在授權HTTP頭中使用該安全令牌,忘記密碼並更改密碼功能。

首先,我們這始終是基礎URL下可達資源用戶模型

https://server/user/{username} 

爲了驗證,我們需要一些安全令牌,所以我們可以發出一個POST到的用戶子資源,創建一個安全令牌:

POST https://server/user/{username}/securityToken 

這會發出一個新的安全令牌,我們可以在HTTP授權標頭中使用它。我在這裏發出POST請求,因爲我們將securityToken建模爲用戶user/someusername/securityToken的某種子資源。您可以使用在安全令牌下創建的子資源向用戶公開功能,以查看所有成功或失敗的登錄請求。

接下來我們要申請一個被遺忘的密碼。這裏重要的是request。這意味着我們發出一個請求並創建一個新的用戶忘記的請求子資源。對於創建子資源,REST風格採用了POST

POST https://server/user/{username}/password/request 

這可以(但它沒有必須的)創建認證時,才能訪問每個密碼請求子資源。因此,您可以公開一個REST樣式的URL,用戶可以隨時獲得所有密碼請求。

最後一個功能更改密碼,現在是很容易的,因爲我們有用戶的密碼子資源,我們可以發出上的密碼資源POST要求:

POST https://server/user/{username}/password 
+1

我喜歡你如何加入「請求」這裏。非常好! :) – Mosh 2012-08-03 04:40:23