在我的扩展程序中,我当前正在使用chrome.webRequest.onAuthRequired.addListener
来捕获代理身份验证对话框并填写凭据:
咖啡:
chrome.webRequest.onAuthRequired.addListener(handleAuthRequest,
{urls: ["<all_urls>"]}, ["asyncBlocking"])
handleAuthRequest = (details, callback) ->
console.debug "AuthRequest received", details
credentials:
username: 'user'
password: 'password'
callback credentials
这很好。但是,当浏览器重新启动且插件未完全加载时,将出现一个对话框(which is a known bug)。
在一个Google网上论坛中,有人提到使用新的declarativeWebRequest
API,该API阻止了浏览器启动。
这是我当前的实现:
registerRules = ->
changeRule =
id: 'auth'
priority: 100
# If any of these conditions is fulfilled, the actions are executed.
conditions: [new chrome.declarativeWebRequest.RequestMatcher(stages: ["onAuthRequired"])]
actions: [new chrome.declarativeWebRequest.SendMessageToExtension(message: 'authRequest')]
callback = ->
if chrome.extension.lastError
console.error "Error adding rules: " + chrome.extension.lastError
else
console.info "Rules successfully installed"
chrome.declarativeWebRequest.onRequest.getRules null, (rules) ->
console.info "Now the following rules are registered: " + JSON.stringify(rules, null, 2)
chrome.declarativeWebRequest.onRequest.addRules [changeRule], callback
chrome.declarativeWebRequest.onMessage.addListener (details) ->
console.info details
registerRules()
onAuthRequired
阶段条件确实按预期工作,但我正在努力寻找一种方法来使用凭据响应身份验证请求。
根据Documentation,onAuthRequest支持的操作是CancelRequest
,IgnoreRules
和SendMessageToExtension
。
前两个动作绝对不是正确的选择,但是由于SendMessageToExtension
不提供回调,然后我如何提供身份验证请求的凭据?
谢谢!
更新:
实际上,当我用此条件替换条件时,onAuthRequired
似乎还没有正确触发:
conditions: [new chrome.declarativeWebRequest.RequestMatcher(contentType: ["text/html"])]
然后正确触发了下面的onMessage侦听器,但没有激活onAuthRequired。
chrome.declarativeWebRequest.onMessage.addListener (details) ->
console.warn "onMessage fired", details
[没有人建议使用六年的干净解决方案,所以这是我正在使用的鸭嘴胶带:
我一开始就在代理授权弹出窗口上苦苦挣扎。
最终我最终像这样延迟了chrome.webRequest.onAuthRequired.addListener
和chrome.proxy.settings.set
的初始化:
var config = {
mode: "fixed_servers",
rules: {
singleProxy: {
scheme: "%protocol",
host: "%proxy_host",
port: parseInt(%proxy_port)
},
bypassList: ["l"]
}
};
function callbackFn(details) {
return {
authCredentials: {
username: "%username",
password: "%password"
}
};
}
setTimeout(function () {
chrome.webRequest.onAuthRequired.addListener(
callbackFn,
{urls: ["<all_urls>"]},
['blocking']
);
chrome.proxy.settings.set({value: config, scope: "regular"}, function() {});
}, 1500); // proxy will be set in a 1.5 sec after the browser start
在我的情况下,这是在Selenium测试中使用的,因此我完全可以控制前1.5秒,我可以允许这段时间进行扩展。