登录表单的HTTP状态代码是否正确?
我正在为一个应用程序实现身份验证,我正在使用一个带有“身份验证方法”的可插拔系统。这使我能够实现HTTP基本身份验证和基于HTML的身份验证 使用HTTP Basic/Digest auth,服务器发送登录表单的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的方式设计我的应
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
直接使用登录表单进行响应(与重定向相反)当然是一种选择,而且实际上可能更有意义