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

标签 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 )。

<小时/>

在 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 支持的操作有 CancelRequestIgnoreRulesSendMessageToExtension

前两个操作绝对不是正确的选择,但由于 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.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 秒,并且我可以授予此时间延长。

关于javascript - 如何使用 declarativeWebRequest 和 onAuthRequired 来填写凭据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21382583/

相关文章:

javascript - 如何处理 props 和 states 以避免无限循环?

Javascript 图像预览始终处于横向模式错误

google-chrome - 下载 session 组件时无法获取正确的参数

javascript - Android 视频元素上的 Chrome 无法从 mediaRecorder blob 数据 url 播放

javascript - 如何创建具有多个 View 的 chrome 扩展

javascript - 通过 PHP 参数将变量传递给 AJAX 函数

javascript - 无法使用 js/jquery 获取多个元素上的 Codemirror textarea 值

google-chrome - chrome 扩展弹出窗口和背景 ajax

firefox - 如何在我的 Firefox/Chrome 扩展程序中使用 AdSense? (反正有吗?)

javascript - 如何在浏览器扩展中动态附加内容脚本?