Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
登录表单的HTTP状态代码是否正确?_Http_Rest_Http Status Codes - Fatal编程技术网

登录表单的HTTP状态代码是否正确?

登录表单的HTTP状态代码是否正确?,http,rest,http-status-codes,Http,Rest,Http Status Codes,我正在为一个应用程序实现身份验证,我正在使用一个带有“身份验证方法”的可插拔系统。这使我能够实现HTTP基本身份验证和基于HTML的身份验证 使用HTTP Basic/Digest auth,服务器发送401未经授权的响应头。然而,根据该报告: 响应必须包括WWW Authenticate标头字段(第14.47节),其中包含适用于请求资源的质询 因为我不知道有任何“html”WWW认证头,所以发送带有html登录表单的401似乎不合适。除此之外还有其他选择吗?我想以RESTful的方式设计我的应

我正在为一个应用程序实现身份验证,我正在使用一个带有“身份验证方法”的可插拔系统。这使我能够实现HTTP基本身份验证和基于HTML的身份验证

使用HTTP Basic/Digest auth,服务器发送
401未经授权的
响应头。然而,根据该报告:

响应必须包括WWW Authenticate标头字段(第14.47节),其中包含适用于请求资源的质询

因为我不知道有任何“html”WWW认证头,所以发送带有html登录表单的
401
似乎不合适。除此之外还有其他选择吗?我想以RESTful的方式设计我的应用程序

基于HTML的登录表单的正确HTTP状态代码(和标题)是什么?当登录失败时,正确的代码是什么


注意:我对摘要身份验证不感兴趣。

这是一个棘手的问题,主要是因为人们使用的最成熟的HTTP客户端是浏览器。根据RFC,
WWW-Authenticate
头可以包含任何内容。基本认证和摘要认证只是进一步标准化质询/响应机制的两个示例。您可以简单地指定一个挑战,如
html表单id=foo
,并将
401
与html表单一起返回。另外,回想一下规范,可以在同一个
WWW-Authenticate
标题中指定多个挑战,但我没有使用不同方案广泛测试浏览器的经验。

对于HTML,我认为您应该使用400

对于非HTML请求也是如此,因为据我所知,401更适合于响应对需要身份验证的内容的请求,而不是响应身份验证请求


HTML并不总是允许纯粹使用RESTful API,因此在我看来,在这里或那里走捷径是可以的,但在这种特殊情况下,也许有一种更好的方式我没有看到。

@2016-02-17更新了

登录表单
http状态应为
200ok

错误
http状态最好使用
401未经授权
。 (名称可能会混淆,401是关于身份验证的

3.1.401未经授权

401(未经授权)状态代码表示请求已被删除 未应用,因为它缺少有效的身份验证凭据 对于目标资源。生成401响应的服务器必须 发送包含以下内容的WWW-Authenticate标头字段(第4.1节): 至少有一个挑战适用于目标资源

如果请求包括身份验证凭据,则401响应表示已拒绝这些凭据的授权。用户代理可以使用新的或替换的授权标头字段重复请求(第4.2节)。如果401响应包含与先前响应相同的质询,并且用户代理已尝试验证至少一次,则用户代理应向用户呈现随附的表示,因为它通常包含相关的诊断信息

如果您想处理没有权限的情况,您可能需要
403禁止
[RFC7231]

HTTP 422用于WebDAV,但其含义可能适合需要。(大多数情况下不建议使用)

有关更多信息,请参见下面的Cássio Mazzochi Molin的评论


@2016-02-12更新(这是对已接受答案的参考。)

登录表单
http状态应为
200

错误
http状态最好使用
400

HTTP 422用于WebDAV,但其含义可能符合需要。 HTTP 401用于授权,不适用于身份验证。


@2016-02-12原件

HTTP 422现在是比400/401更好的选择。HTTP 422是另一种选择

因为这意味着服务器理解数据,但部分数据不正确。也就是说,它可以向客户端显示用户名/密码不正确。

11.2.422不可加工实体

422(不可处理实体)状态代码表示服务器 了解请求实体的内容类型(因此 415(不支持的媒体类型)状态代码不合适),并且 请求实体的语法正确(因此是400(错误请求) 状态代码不合适),但无法处理包含的 例如,如果XML 请求主体包含格式良好的(即语法正确的),但 语义错误的XML指令

这个怎么样

当请求作为公共页面的登录表单时,您会得到您想要的,因此它是一个200状态代码:

GET /login -> 200
当请求需要您未启动的http级别身份验证(基本http、ssl证书等)的页面时,应用程序必须告诉浏览器本身,它需要为您启动此身份验证:

GET /secured -> 401 with WWW-Authenticate header
当身份验证是基于cookie的会话时,您已经有了一个cookie(如果不是这种情况,您将在请求页面时获得一个带有设置cookie头的cookie),但此cookie不会告诉您允许访问
/secured
uri。因此,如果您尝试访问此uri,则应获得“403禁止”状态。然后“登录”操作只不过是通过POST请求更改应用程序的状态,以使应用程序授予对该cookie的访问权限,所以

使用错误的凭据登录:

GET /secured -> 403 with HTML login form (with action="/login")
POST /login -> 403 with HTML login form, displaying errors
使用良好的凭据登录,但权限不足:

GET /secured -> 403 with HTML login form (with action="/login")
POST /login -> 403 with HTML page saying "I know you are John, but you can't get this page"
GET /secured -> 403 with HTML login form (with action="/login")
POST /login -> 302 (temporary redirection to /secured)
GET /secured -> 200
使用良好的凭据和足够的权限登录:

GET /secured -> 403 with HTML login form (with action="/login")
POST /login -> 403 with HTML page saying "I know you are John, but you can't get this page"
GET /secured -> 403 with HTML login form (with action="/login")
POST /login -> 302 (temporary redirection to /secured)
GET /secured -> 200

直接使用登录表单进行响应(与重定向相反)当然是一种选择,而且实际上可能更有意义