You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Chrome扩展代理切换问题:同主机端口不同认证IP始终一致

解决Chrome扩展代理切换(同主机端口不同认证)IP不变的问题

核心原因

Chrome会对相同主机+端口的代理连接进行复用,即便你更新了认证信息,已建立的连接不会自动断开,导致请求仍走旧的代理会话,IP自然不变。而curl每次都是全新请求,不存在连接复用,所以能得到正确结果。

具体解决方案

1. 确保认证监听器正确移除

你之前移除监听器无效,大概率是因为移除时用的回调函数和添加时不是同一个引用。要把回调函数存为固定变量:

// 全局保存回调引用,确保移除时能匹配到
const authCallback = (details) => {
  return {
    authCredentials: {
      username: '新代理用户名',
      password: '新代理密码'
    }
  };
};

// 切换代理时先移除旧监听器
chrome.webRequest.onAuthRequired.removeListener(authCallback);
// 再设置新代理配置
chrome.proxy.settings.set({value: newConfig, scope: 'regular'}, () => {
  // 添加新的认证监听器
  chrome.webRequest.onAuthRequired.addListener(authCallback, {urls: ["<all_urls>"]}, ['blocking']);
});

2. 强制断开已有代理连接

要让Chrome使用新的认证会话,必须断开已有的代理连接。可以借助chrome.networkingPrivateAPI(需要在manifest中声明networkingPrivate权限):

// 获取所有与目标代理相关的socket并关闭
chrome.networkingPrivate.getSockets((sockets) => {
  const proxyHost = newConfig.singleProxy.host;
  const proxyPort = newConfig.singleProxy.port;
  sockets.forEach(socket => {
    if (socket.remoteAddress === proxyHost && socket.remotePort === proxyPort) {
      chrome.networkingPrivate.closeSocket(socket.socketId);
    }
  });
});

如果不想额外申请权限,也可以强制刷新所有打开的标签页(体验稍差,但实现简单):

chrome.tabs.query({}, (tabs) => {
  tabs.forEach(tab => {
    chrome.tabs.reload(tab.id);
  });
});

3. 不要手动设置Authorization头

手动添加这个头会触发Chrome的内置认证弹窗,因为Chrome会优先处理自身的认证流程。正确的方式是在onAuthRequired的blocking回调中返回authCredentials,让Chrome自动处理认证,不会弹窗。

完整切换流程示例

// 全局存储当前的认证回调,用于移除
window.currentAuthCallback = null;

function switchProxy(newProxyConfig, newAuthInfo) {
  // 1. 移除旧的认证监听器
  if (window.currentAuthCallback) {
    chrome.webRequest.onAuthRequired.removeListener(window.currentAuthCallback);
  }

  // 2. 创建新的认证回调
  window.currentAuthCallback = (details) => {
    return {
      authCredentials: newAuthInfo
    };
  };

  // 3. 设置新代理配置
  chrome.proxy.settings.set({value: newProxyConfig, scope: 'regular'}, () => {
    // 4. 添加新的认证监听器
    chrome.webRequest.onAuthRequired.addListener(window.currentAuthCallback, {urls: ["<all_urls>"]}, ['blocking']);

    // 5. 断开旧代理连接
    chrome.networkingPrivate.getSockets((sockets) => {
      const host = newProxyConfig.singleProxy.host;
      const port = newProxyConfig.singleProxy.port;
      sockets.forEach(s => {
        if (s.remoteAddress === host && s.remotePort === port) {
          chrome.networkingPrivate.closeSocket(s.socketId);
        }
      });
    });
  });
}

内容的提问来源于stack exchange,提问作者jonas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 08:08:27