我正在做一个扩展,允许用户存储具有身份验证凭据(用户/通过)的代理服务器并在服务器之间切换。我正在监听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
?
感谢任何人都能散发出的光芒!
答案 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();
});
}