Basic 認証を提供する HTTP プロキシでは、OkHttp の proxyAuthenticator が資格情報を含むリクエストを返すことができます。認証試行がすでに拒否された後は、同じ応答を再送するのではなく null を返します。

.proxyAuthenticator { _, response ->
    if (response.request.header("Proxy-Authorization") != null) {
        null
    } else {
        response.request.newBuilder()
            .header("Proxy-Authorization",
                    Credentials.basic(proxyUser, proxyPassword))
            .build()
    }
}

このスケッチは、アプリケーションのシークレット設定にあるアカウント値を使用します。ガードは最初の試行を許可し、繰り返しの試行を止めます。実装するのは Basic であり、プロキシが通知する可能性のあるすべてのスキームではありません。この応答を選ぶ前にチャレンジを確認してください。

最終結果が依然として 407 である場合は、選択したプロキシ、通知されたスキーム、文書化されたアカウント ID を比較します。拒否されたパスワード、未対応の方式、誤ったユーザー名の形式では、必要な修正が異なります。これらの観察と最終ステータスは、秘匿化した診断情報に残します。

CONNECT には別のコールバック文脈があります。OkHttp はトンネルを開く前に、合成された先制的なプロキシ認証チャレンジを文書化しています。すべてのコールバックが通常の宛先応答だと決めつけず、API に従ってその文脈を扱ってください。

別の authenticator は宛先サーバーの認証用です。その資格情報はプロキシのログインとは分けてください。送信リクエストごとにプロキシのパスワードを付ける汎用インターセプタは、誤ったスコープで送信する可能性があります。

過去の報告には実装上の不具合も記されています。たとえば、拒否されたプロキシ応答の本文処理などです。現在の失敗を古い報告に結び付ける前に、OkHttp のバージョンと最終的なやり取りを記録してください。再試行の判断は、有用な新しい応答がない変化のない資格情報の試行を、依然として止めるべきです。

関連記事