Rust の headless_chrome クレートでは、ブラウザの起動設定が HTTP 中間者を選びます。タブの Fetch ハンドラが、Chromium から要求されたときにアカウントを渡します:

let proxy = "http://proxy.example:8080";
let options = headless_chrome::LaunchOptions::default_builder()
    .proxy_server(Some(proxy))
    .build()?;
let browser = headless_chrome::Browser::new(options)?;
let tab = browser.new_tab()?;

tab.enable_fetch(None, Some(true))?;
tab.authenticate(Some(proxy_user), Some(proxy_password))?;
tab.navigate_to("https://www.example.org/")?;
tab.wait_until_navigated()?;

外側の関数はエラーを伝播し、proxy_user と proxy_password はアプリケーションの既存のアカウント設定から得られる String 値です。ナビゲーションがチャレンジを起こす前に認証を設定してください。

enable_fetch の第 2 引数は認証イベントを有効にします。Chromium は --proxy-server に埋め込まれたユーザー情報をこの資格情報のやり取りとは見なしません。

処理の間はブラウザとタブを生かしておきます。独自の Fetch 傍受も導入している場合は、一時停止したリクエストを誰が再開し、チャレンジに誰が応答するかを決めてください。未解決のまま止まったリクエストはナビゲーションを止めることがあります。

この単純なタブ認証は、想定されたプロキシのチャレンジを前提としています。無関係なオリジンの認証を伴う処理では、中間者のアカウントをすべてのサーバーに使い回すのではなく、チャレンジの範囲を明示する必要があります。Chromium の SOCKS5 におけるユーザー名とパスワードの制限も、この HTTP 認証の経路とは別です。

関連記事