如何使用declarativeWebRequest和onAuthRequired来填写凭据?

时间:2014-01-27 13:50:34

标签: javascript google-chrome google-chrome-extension coffeescript

在我的扩展程序中,我正在使用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支持的操作有CancelRequestIgnoreRulesSendMessageToExtension

前两个操作绝对不是正确的选择,但由于SendMessageToExtension不提供回调,如何为身份验证请求提供凭据

谢谢!


更新

实际上,当我用这个条件替换条件时,似乎另外onAuthRequired没有被正确触发:

conditions: [new chrome.declarativeWebRequest.RequestMatcher(contentType: ["text/html"])]

然后正确地触发下面的onMessage监听器,onAuthRequired不是。

chrome.declarativeWebRequest.onMessage.addListener (details) ->
console.warn "onMessage fired", details

1 个答案:

答案 0 :(得分:0)

6年内没有人建议使用干净的解决方案,所以这是我正在使用的鸭嘴胶带:

一开始,我一直在尝试使用代理授权弹出窗口。

最终,我最终像这样延迟了chrome.webRequest.onAuthRequired.addListenerchrome.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秒,并且可以延长此时间。