在"未经过身份验证"和"未经授权"的情况下使用哪些HTTP代码?

Top*_*era 26 language-agnostic http http-status-codes

我读到当用户使用时必须使用"401 Unauthorized"代码:

  1. 未记录,但需要登录("未经过身份验证");
  2. 已记录,但他的个人资料不允许查看该网址("未授权");

根据RFC,在两种情况下服务器都必须返回401代码.但我需要在我的ajax请求中区分.

任何人都有提示解决这个问题?

注意:我不想使用403 Forbidden代码,因为在403中"Authorization will not help",根据RFC.

tyl*_*erl 42

除非您打算使用HTTP身份验证,否则正确的响应为403("禁止").

响应代码401触发浏览器显示密码对话框,然后使用WWW-Authenticate带有用户提供的密码数据的标头重新提交相同的请求.这可能不是你想要的行为.

不要过于担心RFC中的解释 - 您真正需要注意的是各种响应代码的浏览器和搜索引擎副作用.

至于"Authorization will not help"位,在这种情况下是正确的,因为使用HTTP授权(具体是指WWW-Authenticate标题),实际上是没有用的.

403响应告诉用户没有权限,使该请求的浏览器,浏览器应该不会试图收集验证数据,并重新提交请求.这正是你所追求的回应.


Jul*_*hke 9

我相信403是正确的.我们可能必须调整规范中的语言以使其清楚.

  • (这个问题现在在HTTPbis工作组中被跟踪为http://trac.tools.ietf.org/wg/httpbis/trac/ticket/294) (5认同)
  • rockerest; 首先,RFC 2016已经在很久以前被RFC 2616淘汰了.其次,我*相信*使用403是正确的选择(参见tylerl的答案),如果规范中的文字另有说明,我们应该考虑改变它.我们可以. (4认同)
  • 这是个好消息.规范中的这种含糊不清让我困惑了一段时间. (2认同)

roc*_*est 2

除了状态代码之外,您还应该传递自定义标头以满足应用程序特定需求。

我相信当前的做法是在自定义标题前加上X-

2012 年 8 月更新:

来自评论中发布的RFC 3864 (日期为 2004 年 9 月):

在某些情况下(尤其是 HTTP [24]),标头语法和用法会针对特定应用程序重新定义。[...] 在某些情况下,相同的字段名称可能会被不同地指定(由不同的文档)以用于不同的应用程序协议。[...]我们需要适应特定于应用程序的领域,同时希望认识并促进(在适当的情况下)跨多个应用程序的其他领域的通用性。

在最近的 RFC(6648,日期为 2012 年 6 月)中,他们专门解决了X-标头问题。

弃用应用程序协议中新定义参数的“X-”约定,包括已建立协议的新参数。[...] 不建议反对私有、本地、初步、实验或特定于实现的参数的做法,仅反对在此类参数的名称中使用“X-”和类似结构。

需要注意的是,虽然X-特别说明,但它们仍然隐含地允许自定义标头作为传输信息的方式。应用程序特定的前缀 ( MyApp-) 可能更适合避免与任何其他标头发生冲突。

另请参阅:几年前在 HTTP 响应中使用“X-”标头是否安全。

  • 仅仅因为这是“当前的做法”并不意味着它是正确的做法。有很多更好的方法来具体限定 HTTP 状态代码的含义。例如,返回包含详细信息的正文。 (2认同)