登录和重定向:什么是Web应用程序登录的最佳HTTP流?
这个问题通常是关于web应用程序的登录流的问题。我最感兴趣的答案是在保持安全性的同时优化可用性和性能 处理对书签URL的未经验证请求的最合适方法是什么? 为了演示该问题,以下是示例应用程序的一些路由和相应行为:登录和重定向:什么是Web应用程序登录的最佳HTTP流?,http,rest,authentication,web-applications,web,Http,Rest,Authentication,Web Applications,Web,这个问题通常是关于web应用程序的登录流的问题。我最感兴趣的答案是在保持安全性的同时优化可用性和性能 处理对书签URL的未经验证请求的最合适方法是什么? 为了演示该问题,以下是示例应用程序的一些路由和相应行为: GET /login -> Display the authentication form POST /processLogin -> process the username and password,
GET /login -> Display the authentication form
POST /processLogin -> process the username and password,
if unauthentic...re-render the login form;
otherwise...display the default page
GET /secret -> if authenticated...display the secret resource;
otherwise...display a login form
POST /secret -> if authenticated...perform a desirable, but potentially
non-idempotent action on the secret
resource
otherwise...display a login form
选项1:显示登录屏幕,重定向到所需页面
请注意,Mickeyriss是正确的,使用AJAX选项3没有“断开的后退”按钮的缺点。但是,这意味着用户必须启用JavaScript。这就是说,如果您正确地编程表单,您可以检测是否存在JS,如果不存在,请使用选项1
请注意,302响应很好,但是,缓存可能有问题。如果要在同一URI上显示两个完全不同的页面/表单,则必须确保不会缓存任何内容。(/secret显示登录名,然后显示实际密码。)My$.02:我最近使用选项2实现了(尽管我将
/secret
存储在会话中,而不是作为隐藏字段存储在登录表单中)
我不完全同意你的担忧:
添加了URL显示的问题
在登录更改期间由浏览器执行,这会让用户感到困惑
并中断书签、链接共享等
重定向到/login
,以及随后的URL更改,会告诉用户在继续之前,还需要先做一些其他事情:登录
由于登录页面看起来与“目标页面”完全不同,我不认为这会使人们混淆为书签和/或链接共享登录页面而不是目标页面(因为登录页面不会包含他们想要书签/共享的信息)
如果你担心302的人违反了标准(尽管我知道的每一个浏览器都会很高兴地破解它),考虑使用303的替代品。< /P> < P>选项1和3不遵循“暗中显示登录表单”与200获取响应相反的情况,其中“对应于请求的资源的实体在响应中被发送”。这是意料之中的事
选择2是可以的。所有现代浏览器都支持302on-POST,许多基于REST的框架(如RoR)都积极使用它。或者,在“302 to/login”中,您已经可以创建会话(cookie)并将URL存储在会话中,以避免在GET参数中传递原始URL。从可用性的角度来看,您也可以在登录页面上显示适当的消息(我认为URL不匹配与此无关-您无论如何都不能让用户看到内容) 选项4:当您发布到/secret时,HTTP RFC希望您“接受包含在请求中的实体作为请求行中请求URI标识的资源的新从属”,但您所做的只是登录,而不是在/secret下创建任何新的内容因此,遵循HTTP RFC,您的最佳选择是选项2。实际上,选项2也符合,这有助于解决将URL添加到POST'ed resources书签中的不可预测性问题。我会选择使用AJAX的选项:
location.href
设置您想要的页面
转到,否则您可以输出一条消息,说明登录不正确
有效\u会话
变量上进行测试,如果未设置重定向到登录页面我几乎总是使用选项2,因为URL返回的内容是一致的。虽然今天的秘密隐藏在登录后,但明天您可能希望打开它或显示混合的公共/秘密,具体取决于同一URL上的身份验证。在这种情况下,选项2将最像谷歌的wo