在不是100%AJAX的Ajax应用程序中使用HTTP身份验证的最佳方法是什么

jhe*_*cks 10 ajax jquery xmlhttprequest http-authentication stateless-session

我有一个标准的HTML登录页面,我宁愿使用它而不是浏览器提供的标准HTTP身份验证弹出窗口.今天,我在登录后使用会话cookie跟踪会话,但我希望无状态并且每次都通过HTTP身份验证.我正在尝试的Web服务已经支持这一点,所以这是一个仅限浏览器的问题.

在jQuery中添加身份验证凭据是微不足道的,但我不知道如何保留它们.如果您从登录页面(jsp)转到主页(另一个jsp),您显然不会保留登录页面中的用户名和密码字段.我知道如果您从弹出窗口输入它们,某些浏览器将存储您的HTTP身份验证凭据,但我不知道它们是否在使用XHRRequest时被存储.如果他们这样做,浏览器之间是否有很多一致性?

此外,用户也需要能够"退出"应用程序.如果浏览器存储身份验证凭据,是否有办法使用JavaScript清除它们.

我觉得我不能成为第一个试图解决这个问题的人.是否有一些jQuery插件或已经处理过的东西?或者根本不可能做我想做的事情?

jhe*_*cks 1

更新

下面的答案是 2012 年发布的,链接大多已失效。然而,从那时起,出现了使用JSON Web Tokens来实现同一解决方案的更优雅的基于标准的方法。这是一篇很好的博客文章,解释了如何使用它们。


大多数答案都没有抓住重点,即避免进行任何服务器端会话。我不希望服务器中有任何应用程序状态。我将奖励最接近的答案,但真正的功劳要归功于休息讨论组Jon Moore的正确答案,以及Mike Amundsen帮助我真正理解它。

我得到的最佳答案是使用 cookie,但不是大多数应用程序服务器提供给您的典型自动会话 id cookie。cookie(将自动随每个后续请求发送)是由服务器签名的用户标识符和时间。您可以在 cookie 中包含过期时间,以便它模拟服务器上典型的 30 分钟会话(这意味着您必须通过后续请求将其向前推进),并防止相同的 cookie 永远有效。

XHR/AJAX 部分是一个转移注意力的部分。无论您是执行 XHR 请求还是老式的逐页 Web 应用程序,这都适用。要点是:

  • cookie 会在后续请求中自动发送,因此不需要特殊的脚本 - 这就是浏览器的工作方式。
  • 服务器不需要为用户存储任何会话,因此用户可以访问集群中的任何服务器而不必重新进行身份验证。