更正登录表单的HTTP状态代码?

时间:2011-05-24 12:48:48

标签: http rest http-status-codes

我正在为应用程序实现身份验证,而我正在使用带有“身份验证方法”的可插拔系统。这允许我实现HTTP Basic和基于HTML的身份验证。

使用HTTP Basic / Digest auth,服务器发送401 Unauthorized响应标头。但是,根据HTTP/1.1 RFC

  

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

由于我不知道任何“html”WWW-Authenticate标头,因此发送带有HTML登录表单的401似乎不合适。有没有替代方案?我想以RESTful方式设计我的应用程序。

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

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

4 个答案:

答案 0 :(得分:10)

对于HTML,我认为你应该回复400.

对于非HTML请求也可能如此,因为401据我所知,它更多地旨在响应对需要身份验证的内容的请求,而不是响应身份验证请求。

HTML并不总是允许纯粹使用RESTful API,因此可以在这里和那里偷工减料,但也许在这种特殊情况下我没有看到更好的方法。

答案 1 :(得分:6)

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

答案 2 :(得分:6)

这个怎么样?

当请求登录表格是公共页面时,你会得到你想要的,所以这是一个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

答案 3 :(得分:-3)

@ 2016-02-17 已更新

login form http状态应为200 OK

error http状态更好地使用401 Unauthorized。 (名称可能会混淆,401是关于身份验证。RFC7235

  

3.1。 401未经授权

     

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

     

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

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

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

有关详细信息,请参阅下面Cássio Mazzochi Molin的评论。

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

login form http状态应为200

error http状态更好地使用400

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

@ 2016-02-12 Original

现在,除了400/401之外,HTTP 422是更好的选择.HTTP 422是另一种选择。

因为这意味着服务器了解数据但对部分数据不正确。即它可以向客户显示用户名/密码不正确。

  

11.2。 422不可处理的实体

     

422(不可处理实体)状态代码表示服务器     了解请求实体的内容类型(因此a     415(不支持的媒体类型)状态代码不合适),和     请求实体的语法是正确的(因此是400(错误请求)     状态代码不合适但是无法处理包含的内容     说明。例如,如果是XML,则可能会出现此错误情况     请求正文包含格式正确(即语法正确),但是     语义错误的XML指令。

RFC4918