我將首先指出認證通常是在REST模型之外處理的。當用戶提供他們的憑證時,他們沒有提供其帳戶對象的狀態(REST)的重新呈現;他們也沒有收到這樣的表示。由於用戶帳戶資源狀態不包含「當前」和「新」密碼,因此在請求中提供「當前」和「新」密碼永遠不能真正適合REST模型,但專業人員通常會描述RESTfulness'continuum',其中一些API完全是RESTful,另一些則介於RPC(遠程過程調用)和REST之間。
擁有處理數據模型服務的API的RESTful組件以及處理用戶帳戶的API的更多RPC組件並不少見。你可以在兩者之間做出決定。如果您的項目包含管理多個用戶帳戶的超級用戶,我會建議嘗試將它變成REST API。如果每個用戶只管理他們自己的帳戶,我會建議RPC。
如果您已決定使用REST進行帳戶管理,那麼您必須選擇適當的HTTP方法(GET,POST,DELETE,HEADERS等)。顯然你需要一個方法來影響服務器的變化(POST,PUT,DELETE等)。與上面的用戶orbfish的結論相反,我要說的是,在某些限制下,PUT將是一個合適的方法。
從RFC 2616,正式定義了我們的HTTP方法:
「的方法還可以具有‘冪等性’的屬性在(除了錯誤或過期的問題)N的副作用> 0相同請求是相同的單個請求。該方法GET,HEAD,PUT和DELETE共享這個屬性。此外,所述方法OPTIONS和TRACE不應該有副作用,所以是固有冪等的。「
冪等性這意味着如果我們提出同樣的要求n次連續,服務器在和 th請求的影響下的狀態將與服務器在第一個請求的影響下的狀態相同。用戶orbfish正確地指出,如果我們發出請求:
PUT /users/:id/account {current-password: 'a', new-password: 'b'}
和重複:
PUT /users/:id/account {current-password: 'a', new-password: 'b'}
,我們的第一個請求應該得到指示成功和我們的第二個請求應該收到一個表示失敗的響應的響應。但是,PUT的冪等性只要求服務器的狀態在兩個請求之後都是相同的。它是:第一次請求後用戶的密碼是'b',第二次請求後用戶的密碼是'b'。
我上面提到了限制。您可能想在m嘗試更改密碼失敗後鎖定用戶;這將爲暴力密碼攻擊提供安全保障。但是,這會破壞請求的冪等性:一次發送有效的密碼請求,並且您更改密碼,將其發送m多次,服務器將您鎖定。
通過指定PUT方法,您可以告訴所有客戶端根據需要多次發送請求是安全的。如果我作爲客戶端發送PUT請求,並且我們的連接中斷,以至於我沒有收到您的回覆,我知道再次發送PUT是安全的,因爲它是冪等的:冪等性意味着如果您收到兩個請求將與您的服務器相同,只是接收一個。但是如果你想鎖定我不成功的請求,那麼發送第二個請求是不安全的,直到我知道你是否收到第一個請求。
因此,您可能會考慮PATCH或POST。我會建議使用PATCH。儘管POST被描述爲將新資源附加到列表或將數據附加到現有資源,但PATCH被描述爲在已知URI處的資源上的「部分更新」。與PUT不同,PATCH不需要是冪等的。
驗證當前密碼以防止惡意攻擊(經過身份驗證的用戶嘗試更改具有更多權限的用戶的密碼)。 – orbfish