如何解决登录表单的HTTP状态代码正确吗?
| 我正在为应用程序实施身份验证,并且正在使用具有“身份验证方法”的可插拔系统。这使我既可以实现HTTP Basic认证,又可以基于HTML认证。 使用HTTP基本/摘要身份验证,服务器将发送“ 0”响应标头。但是,根据HTTP / 1.1 RFC: 响应必须包括一个WWW-Authenticate头域(第14.47节),该头域包含适用于所请求资源的质询。 由于我不知道任何\“ html \” WWW-Authenticate标头,因此发送带有HTML登录表单的401
似乎不合适。除此之外,还有其他选择吗?我想以RESTful方式设计我的应用程序。
基于HTML的登录表单的正确HTTP状态代码(和标头)是什么?登录失败时正确的代码是什么?
注意:我对摘要式身份验证不感兴趣。
解决方法
对于HTML,我认为您应该回答400。
就非HTML请求而言,这也可能是正确的,因为据我所知,401的设计目的是响应对需要身份验证的内容的请求,而不是响应身份验证请求。
HTML并不总是允许纯粹使用RESTful API,因此可以在imo处四处走动,但是在这种特殊情况下也许我看不到更好的方法。
,这个如何 ?
当请求登录页面是公共页面时,您将获得所需的内容,因此它是200状态代码:
GET /login -> 200
当请求需要您未启动的http级身份验证的页面(基本的http,ssl证书等)时,应用程序必须告知浏览器本身,它需要为您启动此身份验证:
GET /secured -> 401 with WWW-Authenticate header
当身份验证是基于cookie的会话时,您已经有一个cookie(如果不是这种情况,则在请求页面时将获得带有set-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
,这是一个棘手的问题,主要是因为人们使用的最完善的HTTP客户端是浏览器。根据RFC,“ 8”标头可以包含任何内容。基本身份验证和摘要身份验证只是进一步标准化的质询/响应机制的两个示例。您只需指定诸如a9ѭ之类的挑战,然后将return1ѭ和HTML表单一起返回即可。同样,从规范中回想起,可以在同一个“ 8”标头中指定多个挑战,但是我没有任何使用不同方案对浏览器进行广泛测试的经验。
,@ 2016-02-17更新
login form
http状态应为200 OK
。
error
http状态最好使用401 Unauthorized
。
(名称可能会混淆,401与身份验证有关。RFC7235
3.1。 401未经授权
401(未经授权)状态码表示该请求具有
由于缺少有效的身份验证凭据而未应用
目标资源。伺服器必须产生401回应
发送包含以下内容的WWW-Authenticate标头字段(第4.1节)
适用于目标资源的至少一项挑战。
如果请求包括身份验证凭据,则401响应指示已拒绝这些凭据的授权。用户代理可以用一个新的或替换的Authorization头域(4.2节)重复请求。如果401响应包含与先前响应相同的质询,并且用户代理已经尝试了至少一次身份验证,则用户代理应该向用户呈现随附的表示,因为它通常包含相关的诊断信息。
如果您想在没有权限的情况下进行处理,则可能需要403 Forbidden
[RFC7231]
HTTP 422用于WebDAV,但其含义可能符合需要。 (在大多数情况下不建议使用)
有关更多信息,请参见下面的ѭ17the的注释。
@ 2016-02-12更新(这是对已接受答案的引用。)
login form
http状态应为200
。
error
http状态最好使用400
。
HTTP 422用于WebDAV,但其含义可能符合需要。
HTTP 401用于授权。并且不适合身份验证。
@ 2016-02-12原始
HTTP 422现在是400/401以外的更好选择。HTTP422是替代选择。
因为这意味着服务器可以理解数据,但是对于部分数据而言并不正确。即可以向客户端显示用户名/密码不正确。
11.2。 422无法处理的实体
422(不可处理实体)状态代码表示服务器
了解请求实体的内容类型(因此
415(不受支持的媒体类型)状态码不正确),并且
请求实体的语法正确(因此为400(错误请求)
状态代码不正确),但无法处理其中的内容
说明。例如对于如果XML可能会出现此错误情况
请求正文包含格式正确(即语法正确)的内容,但
语义错误的XML指令。
RFC4918
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。