GoフォワードプロキシでProxy-Authorizationを解析する
GoフォワードプロキシでProxy-Authorizationを個別に解析し、送信先のAuthorizationヘッダーはそのまま保持します。
Goのフォワードプロキシでは、r.BasicAuthはAuthorizationヘッダーを読み取りますが、これは宛先Webサイトへのログインに属するものです。プロキシ自身の資格情報はProxy-Authorizationで届きます。
小さなアダプターを使えば、元のリクエストを変更せずに公開パーサーを再利用できます:
func proxyBasicAuth(r *http.Request) (string, string, bool) {
headers := make(http.Header)
headers.Set("Authorization", r.Header.Get("Proxy-Authorization"))
return (&http.Request{Header: headers}).BasicAuth()
}
この断片はnet/httpを使用します。解析済みの値と解析成功のフラグを返しますが、アカウントの認証は行いません。結果はプロキシが想定する資格情報検証部に渡してください。
認証に失敗した場合は、適切なProxy-Authenticateチャレンジを付けた407を返し、そのリクエストの処理を中止してください。宛先への接続を開く前、またはCONNECTトンネルを受け入れる前に認証を行います。
資格情報を受け入れた後は、通常の転送の前にプロキシ自身のProxy-Authorizationヘッダーを消費します。元のAuthorizationフィールドは送信先のために保持してください。上流に親プロキシがある場合は、このクライアント資格情報を誤って受け取るのではなく、独自の意図的な認証構成が必要です。