2012-07-30 65 views
55

這是一個概念性問題。RESTful登錄失敗:返回401或自定義響應

我有一個客戶端(移動)應用程序,它需要支持針對RESTful Web服務的登錄操作。因爲Web服務是RESTful的,所以這相當於客戶端接受用戶的用戶名/密碼,用服務驗證用戶名/密碼,然後只記得將所有後續請求發送給用戶名/密碼。

此Web服務中的所有其他響應均以JSON格式提供。

問題是,當我查詢Web服務時,只是爲了找出給定的用戶名/密碼是否有效,Web服務是否總是以JSON數據響應告訴我它成功或失敗,或者是否應該返回HTTP 200良好的憑證和HTTP 401憑證不良。

我問的原因是,即使您只是詢問憑據是否有效,其他一些RESTful服務也會使用401作爲錯誤憑據。但是,我對401響應的理解是,它們代表的是一種資源,如果沒有有效的憑據,您將無法訪問該資源。但是登錄資源應該是任何人都可以訪問的,因爲登錄資源的全部用途是告訴你你的憑證是否有效。

換句話說,在我看來,像一個請求:

myservice.com/this/is/a/user/action 

應該返回401,如果提供不正確的憑據。但一個請求,如:

myservice.com/are/these/credentials/valid 

永遠不應該返回401,因爲該特定的URL(請求)被授權有或沒有有效憑證。

我想聽到一些有道理的意見。處理這種情況的標準方式是什麼,並且是處理這種邏輯合適的標準方式?

回答

71

首先。 401是發生失敗登錄時發送的正確響應代碼。

401未授權 類似403禁止,但專爲當需要驗證和已發生故障或尚未提供使用。響應必須包含一個WWW-Authenticate標頭字段,其中包含適用於所請求資源的挑戰。

你一下,myservice.com/are/these/credentials/valid混亂回送401時,你只是做了檢查,我認爲這是基於這樣的事實,這樣做在REST布爾請求往往是錯誤的REST式的約束。每個請求都應該返回一個資源。在REST風格的服務中做布爾問題是RPC的一個難題。

現在我不知道你看到的服務是如何表現的。但解決這個問題的一個好方法就是擁有類似Account對象的東西,以便嘗試GET。如果您的憑證是正確的,您將獲得Account對象,如果您不想爲了「檢查」而浪費帶寬,則可以在相同的資源上執行HEAD。

一個帳戶對象也是一個不錯的地方來存儲所有那些討厭的布爾值,否則將創建個人資源非常棘手。

+1

你關於返回資源的觀點似乎有效,也許這是正確的舉措。至於說401是正確的迴應,我會很感激那裏的一些解釋。我已經閱讀了HTTP規範,就像你在這裏所包含的那樣,但對我而言,這並不是對你的斷言的直接而明顯的確認。也就是說,認證不需要詢問認證的有效性 - 但是你所包含的內容是「專門用於需要認證時使用」。 – Matt 2012-07-30 04:21:55

+2

你的看法是正確的。您無需進行身份驗證即可查詢您的賬戶對象。但是,您需要成功進行身份驗證才能夠接收資源,並且需要進行身份驗證,失敗或尚未提供的身份驗證,因爲您不要求提供憑證的有效性,但是對於特定資源根據您提供的憑據。 – Cleric 2012-07-30 04:31:22

+0

對,我猜我的含義不明確。如果一個賬戶資源被退還,我在你的同一頁面 - 我同意你的立場。當我再次詢問401時,我的意思只是針對我要求有效性的情況。我知道這是來自REST方法的「錯誤」,但我只想爲這個問題得出結論。因此,如果我做錯了錯誤的事情並要求有效性作爲布爾返回,那麼返回401是否不合適,因爲該請求/查詢實際上不需要身份驗證? – Matt 2012-07-30 07:23:16

相關問題