HTTP プロキシからの Basic チャレンジには ProxyBasicAuthHandler を使います。この通常の HTTP の例では、経路とアカウントを 1 つのオープナーにまとめます:

import os
from urllib.request import (
    ProxyHandler, ProxyBasicAuthHandler,
    HTTPPasswordMgrWithDefaultRealm, build_opener,
)

proxy_url = 'http://proxy.example:8080'
passwords = HTTPPasswordMgrWithDefaultRealm()
passwords.add_password(
    None, proxy_url,
    os.environ['PROXY_USER'], os.environ['PROXY_PASSWORD'],
)
opener = build_opener(
    ProxyHandler({'http': proxy_url}),
    ProxyBasicAuthHandler(passwords),
)
with opener.open('http://example.com/', timeout=10) as response:
    print(response.status)

実際のエンドポイントと運用者が提供するアカウントを使ってください。ハンドラー はプロキシのチャレンジにパスワードマネージャーを使います。想定するプロキシ URI と realm を一致させてください。宛先の Basic 認証 は別のハンドラーを使います。

オープナーを直接呼び出すと、この構成はローカルにとどまります。リクエスト URL は中間者ではなく、ウェブサイトのままです。この平文 HTTP の経路は Basic のやり取りを暗号化しません。

この例から HTTPS トンネルの対応を推定しないでください。CONNECT 中の 407 はセットアップ時、宛先からの通常の応答より前に発生します。選択した統合はそこで認証を処理する必要があります。ウェブサイトのログインハンドラーを変えても、その前段のチャレンジは修復できません。

資格情報を含むプロキシ URL は、古い例に見られる別の形式です。使う場合は URL の区切り文字を正しくエンコードし、生成された秘密を含む URL をログに残さないでください。

関連記事