登录和重定向:什么是Web应用程序登录的最佳HTTP流?

登录和重定向:什么是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,

这个问题通常是关于web应用程序的登录流的问题。我最感兴趣的答案是在保持安全性的同时优化可用性和性能

处理对书签URL的未经验证请求的最合适方法是什么? 为了演示该问题,以下是示例应用程序的一些路由和相应行为:

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:显示登录屏幕,重定向到所需页面
  • 用户单击书签
  • GET/secret->200,秘密显示带有隐藏字段路径的登录表单=“/secret”
  • POST/processLogin->302 to/secret(路径参数的值)
  • 获取/机密->200,显示机密资源
  • 分析:希望您的客户端是一个现代浏览器,不兼容HTTP,因此它会在发布302条帖子后执行GET。这适用于所有方面。我应该担心吗

    选项2:重定向到登录屏幕,重定向到所需页面
  • 用户单击书签
  • 获取/secret->302到/login
  • 通过重定向->200获取/登录,登录表单显示为隐藏字段路径=“/secret”
  • POST/processLogin->302到/secret
  • 获取/机密->200,显示机密资源
  • 分析:与上述问题相同。增加了登录期间浏览器显示的URL更改的问题,这会让用户感到困惑,并破坏书签、链接共享等功能

    选项3:显示登录屏幕,显示所需页面
  • 用户单击书签
  • 获取/secret->200,使用action=“/secret”秘密显示登录表单
  • POST/secret->200,显示秘密资源
  • 分析:遗憾的是,刷新按钮现在也坏了:刷新将导致用户代理重新发布警告,而不是重新获取/secret。他们会收到一条警告,但如果他们忽略了它,就会发生不好的事情

    好的一面是,使用这种技术可以最大限度地减少往返

    选项4:重定向到登录屏幕,显示所需页面
  • 用户单击书签
  • 获取/secret->302到/processLogin
  • 通过重定向->200获取/processLogin,登录表单显示为action=“/secret”
  • 发布/保密->302至/保密
  • 获取/机密->200,显示机密资源
  • 分析:与选项2+4相同的问题

    选项5:??? 我还缺少另一种技巧吗

    一般来说,您会推荐以下哪种技术? 另见

    请注意,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