对于存在但用户没有足够权限(他们未登录或不属于正确的用户组)的网页,要提供的正确HTTP响应是什么?
401未授权?403禁止?还有别的吗?
到目前为止,我读到的每一篇文章都不太清楚两者之间的区别。每个响应都适合哪些用例?
对于存在但用户没有足够权限(他们未登录或不属于正确的用户组)的网页,要提供的正确HTTP响应是什么?
401未授权?403禁止?还有别的吗?
到目前为止,我读到的每一篇文章都不太清楚两者之间的区别。每个响应都适合哪些用例?
当前回答
在401对403的情况下,这已经得到了多次回答。这本质上是一场“HTTP请求环境”辩论,而不是“应用程序”辩论。
您自己的登录问题(应用程序)似乎有问题。
在这种情况下,仅仅不登录不足以发送401或403,除非您使用HTTP Auth与登录页面(与设置HTTP Auth无关)。听起来您可能正在寻找一个“201已创建”,其中有一个滚动您自己的登录屏幕(而不是请求的资源),用于应用程序级访问文件。上面写着:
“我听到了,它在这里,但试试这个(不允许你看到)”
其他回答
他们未登录或不属于正确的用户组
你陈述了两种不同的情况;每种情况都应有不同的反应:
如果他们根本没有登录,您应该返回401未授权如果他们已登录但不属于正确的用户组,则应返回403禁止
根据收到的对此答案的评论,请注意RFC:
如果用户未登录,他们将被取消身份验证,其HTTP等效值为401,在RFC中被错误地称为“未授权”。如第10.4.2节所述,401未经授权:
“请求需要用户身份验证。”
如果您未经认证,401是正确的响应。然而,如果您未经授权,在语义正确的意义上,403是正确的响应。
丹尼尔·欧文(Daniel Irvine)的明确解释[原始链接]:
401 Unauthorized(401未授权)存在问题,这是身份验证错误的HTTP状态代码。这就是它:它用于身份验证,而不是授权。收到401响应时,服务器会告诉你,“你不是已验证–完全未验证或已验证不正确–但请重新验证并重试。”为了帮助您,它将始终包含一个WWW Authenticate标头,描述如何以进行身份验证。这是通常由web服务器而不是web返回的响应应用这也是非常暂时的;服务器要求您尝试再一次因此,为了获得授权,我使用403 Forbidden响应。它是永久性的,它与我的应用程序逻辑有关,而且更具体响应大于401。收到403响应时,服务器会告诉你:“对不起,我知道你是谁——我相信你说的你是谁,但你只是没有访问此资源的权限。也许如果你问系统管理员很好,你会得到许可的。但请不要打扰直到你的困境改变。”总之,401未经授权的响应应用于缺失或认证错误,应使用403禁止响应之后,当用户经过身份验证但未被授权对给定资源执行请求的操作。
另一种很好的图片格式,说明如何使用http状态代码。
考虑到最新的RFC(7231和7235),用例似乎非常清楚(添加了斜体):
401表示未经认证(“缺少有效认证”);即“我不知道你是谁,或者我不相信你是你说的那样。”
401未授权
401(未授权)状态代码表示请求没有已应用,因为它缺少有效的身份验证凭据目标资源。生成401响应的服务器必须发送WWW Authenticate头字段(第4.1节),至少包含一个适用于目标资源的挑战。
如果请求包括认证证书,则401响应表明授权已被拒绝资格证书用户代理可以使用新的或替换了Authorization头字段(第4.2节)。如果401响应包含与先前响应相同的挑战用户代理已经至少尝试了一次身份验证,然后用户代理应向因为它通常包含相关的诊断信息。
403表示未经授权(“拒绝授权”);即“我知道你是谁,但你无权访问此资源。”
403禁止
403(禁止)状态代码表示服务器已理解请求,但拒绝授权公开为什么该请求被禁止可以描述这一点响应有效载荷中的原因(如果有的话)。
如果请求中提供了身份验证凭据服务器认为它们不足以授予访问权限。客户不应自动重复相同的请求资格证书客户可以用新的或不同的重复请求资格证书然而,出于某些原因,请求可能被禁止与证书无关。
希望“隐藏”当前存在的禁用的目标资源可能会以状态代码响应404(未找到)。
+----------------------- | RESOURCE EXISTS ? (if private it is often checked AFTER auth check) +----------------------- | | NO | v YES v +----------------------- 404 | IS LOGGED-IN ? (authenticated, aka user session) or +----------------------- 401 | | 403 NO | | YES 3xx v v 401 +----------------------- (404 no reveal) | CAN ACCESS RESOURCE ? (permission, authorized, ...) or +----------------------- redirect | | to login NO | | YES | | v v 403 OK 200, redirect, ... (or 404: no reveal) (or 404: resource does not exist if private) (or 3xx: redirection)
检查通常按以下顺序进行:
404如果资源是公共的且不存在或3xx重定向否则:401如果未登录或会话已过期403如果用户没有访问资源的权限(文件、json…)404如果资源不存在或不愿意透露任何信息,或3xx重定向
未授权:状态代码(401)指示请求需要身份验证,通常这意味着用户需要登录(会话)。服务器未知的用户/代理。可以使用其他凭据重复。注意:这令人困惑,因为它应该被命名为“未经验证”而不是“未经授权”。如果会话过期,登录后也可能发生这种情况。特殊情况:可以代替404使用,以避免显示资源的存在或不存在(credits@jiangCodeNinja)
禁止:状态代码(403),表示服务器理解请求但拒绝执行。服务器知道用户/代理,但没有足够的凭据。除非凭据更改,否则重复请求将不起作用,这在短时间内是非常不可能的。特殊情况:可以使用404代替404,以避免在显示资源的存在暴露敏感数据或向攻击者提供有用信息的情况下显示资源(credits@jiangCodeNinja)的存在或不存在。
未找到:状态代码(404),指示请求的资源不可用。用户/代理已知,但服务器不会透露任何有关资源的信息,就像它不存在一样。重复不起作用。这是404的一个特殊用法(例如github)。
如@ChrisH所述,有几个3xx重定向选项(301、302、303、307或根本不重定向,使用401):
HTTP重定向代码之间的差异浏览器缓存HTTP 301多长时间?重定向到登录页面时,正确的HTTP状态代码是什么?302和307重定向之间有什么区别?
401响应是指以下之一:
缺少访问令牌。访问令牌已过期、吊销、格式错误或无效。
403响应另一方面意味着访问令牌确实有效,但用户没有执行所请求的操作的适当权限。