在当前的 Electron 应用中,为每个与账户关联的 WebContentsView 分配各自的命名会话。应用就绪后,主进程中的异步辅助函数可以配置一个视图:

const routeSession = session.fromPartition(partitionName);
await routeSession.setProxy({
  mode: 'fixed_servers',
  proxyRules: `http://${proxyHost}:${proxyPort}`,
});
const view = new WebContentsView({
  webPreferences: { session: routeSession },
});
view.webContents.on('login', (event, details, authInfo, callback) => {
  if (!authInfo.isProxy
      || authInfo.scheme.toLowerCase() !== 'basic'
      || authInfo.host !== proxyHost
      || authInfo.port !== proxyPort) return;
  event.preventDefault();
  if (details.firstAuthAttempt) callback(proxyUser, proxyPassword);
  else callback();
});

为每个隔离账户提供不同的 partitionName,并把监听器变量保留在该视图自己的闭包中。不带 persist: 的名称会创建内存会话。复用同一分区会有意复用其会话状态。

将视图挂接到现有窗口,并且仅在其代理和处理程序就绪后再导航。代码针对当前 login 事件契约(包括 firstAuthAttempt),并取消被拒绝的重复尝试,而不是无限重发同一账户。

处理程序会检查质询是否来自预期的 Basic HTTP 代理。网站登录不适用于这些凭据。

代理规则选择端点;login 提供账户。PAC 文件和手动代理规则本身并不携带此 callback 的密码。

这是 HTTP 代理身份验证。它不会向 Chromium 添加 SOCKS5 身份验证。现有会话连接在之后更改路由时也需要其常规生命周期处理。

相关文章