OkHttp Basic プロキシ認証:拒否された再試行を止める
OkHttp の proxyAuthenticator をプロキシのチャレンジに使い、変化のない認証試行を繰り返すのをやめます。
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 のバージョンと最終的なやり取りを記録してください。再試行の判断は、有用な新しい応答がない変化のない資格情報の試行を、依然として止めるべきです。