用于指示授权义务的正确HTTP状态代码是什么?

时间:2014-05-21 14:45:16

标签: web-services http rest xacml

我有一个HTTP"休息"我正在创建用于访问用户数据的Web服务API。

Web服务与XACML策略决策点集成。策略决策点根据用户和正在访问的数据确定请求是否被授权。通常,响应是" permit" (允许采取行动)或"拒绝" (不允许采取行动)。

如果允许,则继续呼叫并返回数据。 如果拒绝,则中止调用并返回HTTP 403(禁止)。

但是,某些政策有"义务"表示通过进一步行动有条件地允许该行动。我通常使用的类比是"这个信用卡交易可能被允许,但是职员需要查看客户的ID,然后再次打电话声明该ID与信用卡匹配&#34 ;

在我的网络服务中,我想提示客户采取行动,并在请求网址中包含其他信息,以表明履行了义务。我正在通过客户端应用程序理解的结构化主体响应来传达此信息。

我的问题是在方案中使用的适当HTTP状态代码是什么。 " 403"不合适(来自HTTP规范Authorization will not help and the request SHOULD NOT be repeated的文本)。 我最好的猜测是" 401" (未经授权),但我不确定此状态代码是否特别围绕使用授权标头和用户名/密码类型的问题。

2 个答案:

答案 0 :(得分:1)

也许您可以使用HTTP状态代码303或307将用户指向临时重定向位置,该位置以某种方式编码额外的"义务"?

答案 1 :(得分: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或者放置,然后在稍后的帖子中确认。此选项需要更多的状态管理服务器端,因为您首先接受操作,然后等待客户端确认它。

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

有一点要始终牢记义务,但是......他们总是强制执行客户端,所以除非义务涉及点击您的服务可以反复检查的其他服务,否则您永远不会知道客户实际上履行了义务。如果你不控制客户,那么义务就是真正的戏剧。