【问题标题】:How to suppress the browser's "authentication required" dialog when doing an ajax call that requires authentication?在进行需要身份验证的 ajax 调用时,如何抑制浏览器的“需要身份验证”对话框?
【发布时间】:2009-10-26 19:42:08
【问题描述】:

我的用户输入第三方服务的用户名和密码。我对该服务进行 ajax 调用以对其进行身份验证。问题是,如果他们输入错误的用户名和密码,浏览器(至少是 firefox)将显示“需要身份验证”对话框。如果他们随后在该对话框中输入正确的用户名和密码,我的 ajax 调用将返回“成功”,并且看起来他们输入的原始用户/密码是正确的,但实际上不是(因为他们更改了它)。

有什么方法可以抑制这个对话框(这样我就可以让我的服务告诉他们更正他们的用户/密码)或者以某种方式获取用户在浏览器对话框中输入的正确用户名和密码?这是一个 firefox 扩展.. 所以我确信有一些方法可以从请求中获取正确的通行证/登录名.. 但是如果有一个通过 javascript 更简单的方法会很好。

jQuery.ajax({
  type: "GET",
  dataType: "xml",
  url: endpoint,
  username: username,
  password: password,
  success: function(data,status) {
    // Do something
  },
  error: function(XMLHttpRequest, textStatus, errorThrown){
    alert(errorThrown);
  }
});

【问题讨论】:

    标签: javascript ajax firefox-addon


    【解决方案1】:

    我通过在浏览器和需要身份验证的服务(在我的例子中是一个 java servlet)之间放置一个代理解决了这个问题。浏览器将 AJAX 请求发送到 servlet,servlet 将请求转发给服务,然后发回服务的响应,省略“WWW-Authenticate”标头。您的浏览器应用程序。相应地处理 HTTP 200 或 401 响应代码。

    同样,代理总是可以返回一个 200 和一个 json 响应,指示转发请求的结果。通过这种方式,您可以辨别代理故障和服务响应之间的区别。

    您可能需要处理一件棘手的事情 - 如果远端服务响应一个 set-cookie 标头,比如因为它为您的客户端创建了一个会话,那么您(至少)有 2 条可能的路径可供选择。

    1. 您的代理会记住 cookie,即您的浏览器应用程序。总是经过这个服务的代理,代理把这个cookie添加到后续转发的请求中。 或
    2. 您忽略服务的 cookie,并在您通过代理验证用户名和密码后让浏览器直接使用服务重新验证。虽然这可能会产生与服务创建孤立会话的副作用

    【讨论】:

      【解决方案2】:

      网址字符串不是“http://blah.com”,而是“http://user:password@blah.com

      // Note that you might need to trim http:// out of endpoint first
      url: 'http://' + username + ':' + password + '@' + endpoint,
      

      【讨论】:

      • 这真的能解决问题吗?我希望如果 URL 中指定的用户名和密码不正确,远程服务器仍会发出 401 响应...
      【解决方案3】:

      没有 jquery(在 IE 中不起作用,但对于 firefox 扩展来说没问题):

      var xhr = new XMLHttpRequest();
      xhr.open("GET", "http://example.com", true, "username", "password");
      xhr.onreadystatechange = function(){
        if(this.readyState == 4){
          if(this.status == 200){
            alert("we got a response");
          }
        }
      }
      xhr.send();
      

      【讨论】:

        【解决方案4】:

        不使用 HTTP 身份验证怎么样?使用带有 cookie 的标准登录,或者简单地将用户提供给脚本的用户名/密码 POST 并对照用户数据库检查详细信息。

        【讨论】:

        • 他说是第三方产品造成的。
        【解决方案5】:

        您不能在 IE 或 firefox 中执行此操作,并且出于安全原因,您将永远无法从 javascript 执行此操作。没有浏览器设置可以让用户避免提示进行 http 身份验证。当您有 50 张图片都需要 http 身份验证时,这真的很烦人。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-01-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多