2014-05-21 20 views
1

我有一個HTTP「rest」web服務API,用於訪問用戶數據。什麼是用於指示授權義務的正確的HTTP狀態碼?

Web服務與XACML策略決策點集成。策略決策點確定請求是否被授權爲用戶和被訪問數據的函數。一般來說,回答是「允許」(允許動作)或「拒絕」(動作不允許)。

如果允許,則繼續調用並返回數據。 如果拒絕,則呼叫中止並返回HTTP 403(禁止)。

但是,某些政策有「義務」,表明行動有條件允許採取進一步行動。我通常使用的類比是「這種信用卡交易可能被允許,但店員需要查看客戶的身份證,然後再次打這個電話確認身份證與信用卡相匹配」。

在我的網絡服務中,我想提示客戶採取措施並在請求URL中包含更多信息以表明已履行義務。我將這些信息與客戶應用程序理解的結構化機構響應進行通信。

我的問題是在場景中使用什麼合適的HTTP狀態代碼。 「403」不合適(來自HTTP規範Authorization will not help and the request SHOULD NOT be repeated的文本)。 我最好的猜測是「401」(未經授權),但我不確定此狀態代碼是否專門用於使用授權標頭和用戶名/密碼類型的問題。

+0

401保留用於HTTP身份驗證(請參閱) –

回答

1

也許你可以使用HTTP狀態碼303或307來指向用戶臨時重定向位置,該位置以某種方式編碼額外的「義務」?

+0

到目前爲止,307是我如何實現它的。我覺得這種方法很「髒」,但看起來確實有效。 – jayraynet

1

401的回答對我來說似乎是合理的。 HTTP認證機制是可擴展的,因此您可以想象創建一個自定義認證方案,以便您按照RFC的要求正確設置WWW-Authenticate標頭。瀏覽器不知道如何處理您的自定義方案,但我假設您的客戶不是瀏覽器,如果他們必須瞭解義務是什麼。

實施例請求序列:

PUT /some/resource/that/has/obligations HTTP/1.1 
Content-Type: application/json 
Authorization: token my-oauth-token 

HTTP/1.1 401 Unauthorized 
WWW-Authenticate: obligation urn:my-app:my-obligation;param1;param2 

PUT /some/resource/that/has/obligations HTTP/1.1 
Content-Type: application/json 
Authorization: token my-oauth-token 
Authorization: obligation urn:my-app:my-obligation:result=ok 

HTTP/1.1 201 Created 
Location: /some/resource/that/has/obligations/1 

另一種選擇是對初始後返回202或放,並且t母雞在稍後的帖子中確認。這個選項需要更多的狀態管理服務器端,因爲你首先接受這個操作,然後等待客戶端確認它。

PUT /some/resource/that/has/obligations HTTP/1.1 
Content-Type: application/json 
Authorization: token my-oauth-token 

HTTP/1.1 202 Accepted 
Location: /some/resource/that/has/obligations/1 
X-Obligation: urn:my-app:my-obligation;param1;param2 

POST /some/resource/that/has/obligations/1 HTTP/1.1 
Content-Type: application/json 
Authorization: token my-oauth-token 
X-Obligation: urn:my-app:my-obligation;result=ok 

HTTP/1.1 200 OK 

有一兩件事要始終牢記與義務,但...他們總是強迫客戶端,因此,除非該義務涉及到另一項服務,您的服務可以複覈,您永遠不知道是否e客戶實際上履行了義務。如果你不控制客戶,那麼義務真的只是戲劇。

相關問題