Electron 视图可以拥有独立的 HTTP 代理账户
为每个 WebContentsView 创建账户专属会话,并且只响应与该视图匹配的 Basic 代理质询。
在当前的 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 身份验证。现有会话连接在之后更改路由时也需要其常规生命周期处理。