だから私は次のシナリオを実装しようとしています:
app.com
でホストされているとしましょうproxy.com
でホストされていますしたがって、ユーザーは同じ要求でプロキシとアプリケーションの両方の資格情報を提供する必要があります。したがって、ユーザーは異なるユーザー名/パスワードのペアを持ちます。
仕様を読んだ後、私はこれをどのように実装するべきか本当にわかりません。私がやろうとしていたことは:
407 Proxy Authentication Required
に応答し、Proxy-Authenticate
の形式で"Proxy-Authenticate: Basic realm="proxy.com"
ヘッダーを返します。Proxy-Authenticate
ヘッダーは正しく設定されていますか?Proxy-Authorization
ヘッダー、つまりプロキシusername:password
のBase64表現でリクエストを再試行します。401 Unauthorized
ヘッダーで応答します。ユーザーはプロキシによって認証されましたが、アプリケーションによっては認証されませんでした。アプリケーションは、WWW-Authenticate
のようなWWW-Authenticate: Basic realm="app.com"
ヘッダーを応答に追加します。 質問:このヘッダー値は正しいですか?Proxy-Authorization
ヘッダーと、アプリのusername:password
のBase64表現で評価されたAuthorization
ヘッダーの両方を使用して、リクエストを再試行します。ワークフロー全体は正しいですか?
はい、それはあなたが説明した状況に対する有効なワークフローのように見え、それらの認証ヘッダーは正しい形式であるようです。
珍しいことではありますが、接続に複数のプロキシが連鎖している可能性があり、各プロキシ自体が認証を必要とする可能性があることに注意してください。この場合、各中間プロキシのクライアント側自体が407 Proxy Authentication Required
メッセージとそれ自体は、Proxy-Authorization
ヘッダー; Proxy-Authenticate
およびProxy-Authorization
ヘッダーは、1つのサーバーから次のサーバーに渡されないシングルホップヘッダーですが、WWW-Authenticate
およびAuthorization
は、クライアントから最終サーバーへと見なされるエンドツーエンドのヘッダーであり、仲介者によって逐語的に渡されます。
Basic
スキームは平文でパスワードを送信するため(base64は可逆エンコーディングです)、SSLで最も一般的に使用されます。このシナリオは別の方法で実装されます。これは、最終サーバーに送信されたパスワードがプロキシから見えないようにすることが望ましいためです。
CONNECT
リクエスト (まだProxy-Authorization
ヘッダー)TCPリモートサーバーへのトンネルを開く)。Authorization
ヘッダーを含む最終HTTPメッセージを転送します。このシナリオでは、プロキシはクライアントが接続しているホストとポートのみを認識し、内部SSLチャネルを介して送信または受信したものを認識しません。さらに、ネストされたチャネルを使用すると、クライアントはプロキシとサーバーの両方のSSL証明書を「見る」ことができ、両方のIDを認証できます。