如何防止Safari拦截对Ajax请求的401响应

问题描述:

我在Safari扩展中遇到以下问题。我要求用户提供他们的Web服务的用户名/密码,并发送一个快速请求来验证凭据是否正确。如果他们不这样做,服务会以我认为应该的方式回应401。问题在于Safari似乎在我的javascript代码可以处理它之前拦截此响应,显示灰色的登录框而不是让我处理错误。如何防止Safari拦截对Ajax请求的401响应

我能做些什么吗?我正在使用js库进行调用,但它在功能上等同于以下jQuery。

$.ajax({ 
    type: "GET", 
    url: url, 
    username: username, 
    password: password, 
    success: function() { /* handle success */ }, 
    error: function() { /* handle error */ } 
}); 

据我所知(后有过这个问题,我自己)没有办法,你会得到Safari浏览器停止拦截401。如果这些发现是正确的,唯一的方法是创造性(读取:错误)使用另一个错误代码,例如403,或使用自定义的(见下文)。

当然,这里假定您可以访问更改从Web服务发送回来的状态代码(如果您也开发Web服务,这个问题还不完全清楚)。

403当然,真的说“你已经被认证,但没有被授权访问这个资源”,这是不正确的(因此“滥用”),但至少在浏览器中没有副作用我知道。

400有时用作替代方法,但由于该方法(“错误请求”)实际上意味着表示HTTP协议错误,因此可能会导致副作用(从未见过或听说过它发生过,但可能是它可能会导致某些未来浏览器或反劫持软件启动故障排除/诊断的过度帮助尝试)。

412是我见过的使用(“先决条件失败”)另一种选择,但它实际上是为了表明服务器没有辜负先决条件要求集。或者你可以自己编写非标准的4xx错误 - 例如: 461 - 这是允许的(注意,Twitter也有一个自定义420状态代码,例如)

+0

感谢您的详细解答!我其实可以访问该服务,因此我可以创建一个新端点来处理此问题。我想其他处于类似情况的人至少可以做一个超级黑客代理来解决这个问题。 – 2012-02-04 17:42:02

更正确的方法是继续使用401作为错误代码,但不发送WWW-Authenticate头球时凭据已发送但他们不正确。

不再触发浏览器对话框,并允许您直接处理401

+2

未发送“WWW-Authenticate”标头是错误的!将自定义值发送给浏览器无法解释的“WWW-Authenticate”。这样,浏览器将不会显示登录窗口。请参阅:http://*.com/questions/1748374/http-401-whats-an-closed-www-authenticate-header-value – SimonSimCity 2014-04-10 07:34:15