我正在为应用程序实现身份验证,而我正在使用带有“身份验证方法”的可插拔系统。这允许我实现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状态代码(和标头)是什么?当登录失败时,正确的代码是什么?
注意:我对摘要式身份验证不感兴趣。
答案 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指令。