在Chrome扩展程序中强制代理重新认证

时间:2018-11-25 17:25:32

标签: javascript authentication google-chrome-extension proxy firefox-webextensions

我正在做一个扩展,允许用户存储具有身份验证凭据(用户/通过)的代理服务器并在服务器之间切换。我正在监听webRequest.onAuthRequired事件,并且当服务器要求进行身份验证时,按照此处的provideCredentialsSync示例,证明用户已保存的用户名/密码:https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/webRequest/onAuthRequired#Examples

问题在于,提供这些凭据后,它们似乎会保存/缓存在开发人员无法访问的扩展中的某个位置,然后不断重复使用。因此,如果扩展用户然后将其凭据更改为不正确,则浏览器会自动在其Proxy-Authorization标头中继续使用经过身份验证的凭据,并且请求成功。反之亦然,如果身份验证失败,并且按照上述示例取消了请求,则用户将其凭据更改为正确的,服务器不会再次挑战身份验证,并且请求将无法提供新凭据。

Chrome也不允许修改传出的Proxy-Authorization标头,这意味着不能在代码中删除/更改标头以迫使服务器再次挑战。

所以我想核心问题是:

  • 有没有人知道从计算机返回的详细信息保存在哪里? webRequest.onAuthRequired听众,有没有办法 清除/清除?

  • 返回{cancel: true}时实际发生的情况以及为什么对该服务器的所有请求随后继续失败而没有触发 另一个onAuthRequired

感谢任何人都能散发出的光芒!

4 个答案:

答案 0 :(得分:2)

  

问题在于,提供这些凭据后,它们似乎会保存/缓存在开发人员无法访问的扩展名中,然后不断重复使用

不完全是...代理服务器不会在每个连接请求上发送Auth请求(需要407代理身份验证)。他们经常定期检查(取决于他们的设置)。

浏览器也可以缓存(例如,在Firefox中自动登录但Chrome没有的情况下。)

  

有人从webRequest.onAuthRequired侦听器返回时是否知道详细信息的保存位置,并且有清除/清除的方法吗?

重要的一点是,如果前一个正确,则客户端无需将不同的凭据发送到同一服务器。

服务器请求凭据:

  • 如果传递了正确的密码,则允许这样做,并且服务器和浏览器都将其保留一段时间
  • 如果传递了错误的密码,则浏览器不会保留该密码,但服务器可能会阻止 重复尝试一段时间,然后重新请求身份验证

您可以删除并重新启动webRequest.onAuthRequired,但就我个人而言,我并没有发现这样做的必要,除非我在开​​发期间通过有意发送错误的凭据来测试错误的身份验证结果,供客户使用的情况。

服务器请求时会触发

webRequest.onAuthRequired。您可以尝试对其进行记录,以查看服务器执行该操作的频率。

扩展代码(我的意思是开发人员代码,而不是浏览器)也可以缓存凭据(以避免进行异步调用并降低身份验证速度,从而降低连接速度)。

我个人会缓存所有代理的所有凭据,然后相应地响应身份验证请求。否则,您可以更改扩展代码缓存对象和/或删除并重新启动webRequest.onAuthRequired

  

返回{cancel:true}时实际发生什么,为什么对该服务器的所有请求又继续失败而又不触发另一个onAuthRequired?

这取决于扩展代码和服务器设置。身份验证失败后,服务器设置可能会在一段时间内阻止连接(以防止Ddos攻击)。

扩展代码还可以在发送{cancel: true}之前终止连接,从而检查正确的身份验证。实际上,很少需要发送{cancel: true}

还有可能进入错误身份验证循环,这将导致连接失败并锁定浏览器。

chrome中,我将使用(必须使用且必须使用)Promise,这是一种正确的身份验证方法,因为代码将停止执​​行直到承诺被解决。使用回调函数(chrome API使用的回调函数)无法做到这一点,这可能是导致问题的原因。

为了简化:

  • 添加webRequest.onAuthRequired
  • 根据身份验证请求,启动new Promise以获取正确的凭据
  • 为避免身份验证失败循环做准备

答案 1 :(得分:0)

我实际上从未使用过它,但是也许它是Cache-Control?这是指向Standard

的链接

答案 2 :(得分:0)

只需拨打https://developer.chrome.com/extensions/webRequest#method-handlerBehaviorChanged,Chrome就会再次要求扩展提供信用(您必须使用回调调用它,然后以侦听器的阻止模式等待解析)。如果要取消请求,则必须在onBeforeRequest中执行此操作,因为onAuthRequired是可选的侦听器

答案 3 :(得分:0)

终于找到了适合我的解决方案。

重要提示:这仅适用于 Chrome,在撰写本文时不适用于 Firefox(Firefox 版本 87.0)

身份验证凭据不存储为 cookie。但是,清除给定根域的所有 cookie 似乎会触发浏览器也清除该域(及其所有子域)的所有身份验证凭据

这是我可以让 Chrome 在单个浏览器会话中为给定域多次触发 webRequest.onAuthRequired 事件的唯一方法。

function clearAuthenticationCache(rootDomain, callback){

    //Chrome allow us to clear the authentication credentials for a given domain by clearing ALL cookies for that domain
    //IMPORTANT: you have to use the root domain of the proxy 
    //(eg: if the proxy is at foo.bar.example.com, you need to use example.com)

    var options = {};
    options.origins = [];    
    options.origins.push("http://"+ rootDomain);
    options.origins.push("https://"+ rootDomain);

    var types = {"cookies": true};

    chrome.browsingData.remove(options, types, function(){
        callback();
    });         
}