在我的扩展程序中,我正在使用chrome.webRequest.onAuthRequired.addListener
来捕获代理身份验证对话框并填写凭据:
CoffeeScript的:
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)。
在谷歌小组中,有人提到要使用新的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
答案 0 :(得分:0)
6年内没有人建议使用干净的解决方案,所以这是我正在使用的鸭嘴胶带:
一开始,我一直在尝试使用代理授权弹出窗口。
最终,我最终像这样延迟了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秒,并且可以延长此时间。