如何抑制浏览器所需的身份验证”进行需要身份验证的ajax调用时的对话框?

StackOverflow https://stackoverflow.com/questions/1626919

  •  06-07-2019
  •  | 
  •  

我的用户输入第三方服务的用户名和密码。我对该服务进行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);
  }
});
有帮助吗?

解决方案

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

类似地,代理总是返回200,其中json响应指示转发请求的结果。通过这种方式,您可以辨别代理失败与服务响应之间的区别。

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

  1. 您的代理将记住Cookie,您的浏览器应用。始终通过该服务的代理,代理将此cookie添加到后续转发的请求中。 或
  2. 您忽略了服务的cookie,并且一旦您通过代理验证了用户名和密码,浏览器就会直接使用该服务重新进行身份验证。虽然这可能会产生与服务创建孤立会话的副作用

其他提示

而不是网址字符串是“ http://blah.com ”,而不是“< a href =“http:// user:password@blah.com”rel =“nofollow noreferrer”> http:// user:password@blah.com &quot;

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

没有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();

如何不使用HTTP身份验证?使用带有cookie的标准登录,或者只是将用户提供给脚本的用户名/密码POST,并根据用户数据库检查详细信息。

你无法在IE或Firefox中执行此操作,并且出于安全原因,您永远无法使用javascript。没有浏览器设置可以避免用户提示进行http身份验证。当您有50张图像都需要http身份验证时,这会变得非常烦人。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top