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

igo*_*orw 25 rest http http-status-codes

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

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

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

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

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

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

Sel*_*aek 10

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

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

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


Cha*_*ste 7

这个如何 ?

在请求登录表单是公共页面时,您可以获得所需内容,因此它是200状态代码:

GET /login -> 200
Run Code Online (Sandbox Code Playgroud)

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

GET /secured -> 401 with WWW-Authenticate header
Run Code Online (Sandbox Code Playgroud)

当身份验证是基于cookie的会话时,您已经拥有一个cookie(如果不是这种情况,您将在请求页面时获得一个带有set-cookie标头的cookie),但此cookie并不表示您可以访问该/securedURI.因此,如果您尝试访问此uri,则应获得"403禁止"状态.然后"登录"操作只是通过POST请求更改应用程序的状态,以使该cookie的应用程序授予访问权限,因此......

使用错误的凭据登录:

GET /secured -> 403 with HTML login form (with action="/login")
POST /login -> 403 with HTML login form, displaying errors
Run Code Online (Sandbox Code Playgroud)

使用良好的凭据但没有足够的权限登录:

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"
Run Code Online (Sandbox Code Playgroud)

使用良好的凭据和足够的权限登录:

GET /secured -> 403 with HTML login form (with action="/login")
POST /login -> 302 (temporary redirection to /secured)
GET /secured -> 200
Run Code Online (Sandbox Code Playgroud)


Hun*_*ris 6

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