2012-02-09 58 views
22

身份驗證服務允許禁用用戶帳戶(某種軟刪除)。對於「禁用」用戶,HTTP 401未授權或403禁止?

如果服務器然後收到一個禁用的用戶認證請求,否則將是有效的,如果服務器返回401或403?無論使用哪種狀態碼,我都會返回一條消息,指出該帳戶已被禁用。

對於快速參考,從HTTP/1.1 spec(重點煤礦)的相關報價:

401未授權

請求需要用戶驗證。響應必須包含一個 WWW-Authenticate標頭字段(14.47節),其中包含一個適用於請求資源的挑戰 。 客戶端可以用合適的授權標頭字段(14.8節)重複 請求如果 請求已包含授權憑證,那麼401 響應表明授權已被拒絕,這些憑證 憑證。如果401響應包含相同的挑戰,因爲 前一響應,並且用戶代理已經嘗試至少一次 認證,那麼用戶應提交這是在響應給出的 實體,因爲該實體可能 包括相關的診斷信息。 HTTP訪問認證 在「HTTP認證:基本和摘要訪問 認證」[43]中進行了說明。

403禁止

服務器理解了請求,但拒絕執行。 授權不會幫助請求不應重複。 如果請求方法不是HEAD並且服務器希望公開讓 爲什麼請求未被滿足,那麼應該描述在實體中拒絕的原因 。如果服務器不希望 將該信息提供給客戶端,則可以使用狀態碼404 (未找到)代替。

+0

類似的問題在這裏(它可能有所幫助):http://stackoverflow.com/questions/8389253/correct-http-status-code-for-resource-which-requires-authorization/ – 2012-02-10 01:54:10

回答

30

根據Roy T. Fielding編寫的an email,在當前HTTP規範中顯然有a bug

方式的規範是來閱讀如下(使用從上面的電子郵件引號):

401「未」

你不能這樣做,因爲你還沒有驗證

403 「未授權」

用戶代理髮送的有效憑據,但無權訪問

所以,在禁用的用戶的情況下,403是正確的響應(和404也是一個選項)。

1

從技術上講,兩者都是正確的,它的真正歸結到你想透露多少。

返回401對調用者說,該帳戶是無效的,這是正確的,但如果你的api然後將被再次調用註冊一個用戶具有相同的憑據,該調用也將失敗。這可能對呼叫者沒有多大用處。

所以,這真的取決於你的API將如何使用以及目標受衆是誰/什麼。

9

我有兩個不同的答案,在這種情況下返回什麼。

語義選擇 - 401未授權。在這種情況下,您的客戶端提供了憑據,並且基於特定憑據拒絕了請求。如果客戶再次嘗試使用不同的憑據集,或者未來將重新啓用該帳戶,則同一請求可能會成功。

安全選擇 - 404找不到。爲了避免信息泄漏,許多服務將僅僅返回一個404錯誤信息。 Github立刻想到了我的想法。

General API Information,在GitHub的開發者文檔:

身份認證的請求將返回404,以防止任何形式的 私人信息泄露。

對於我作爲公共服務部署的某些東西,我可能會使用404來避免給予攻擊者有關其憑據嘗試的線索。如果是僅供內部使用,或者在測試中,我可能會返回401.

+0

+1,尤其是對於製作404的情況,但我認爲HTTP規範是基於我發現的W3討論和錯誤。 – Dolph 2012-02-14 17:33:59