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フィールドは送信先のために保持してください。上流に親プロキシがある場合は、このクライアント資格情報を誤って受け取るのではなく、独自の意図的な認証構成が必要です。

関連記事