В forward-прокси на Go r.BasicAuth читает заголовок Authorization, который относится к входу на целевой сайт. Собственные учётные данные прокси приходят в 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. Он возвращает разобранные значения и признак успешного разбора; он не аутентифицирует учётную запись. Передайте результат предусмотренному валидатору учётных данных прокси.

Если аутентификация не удалась, верните 407 с подходящим вызовом Proxy-Authenticate и прекратите обработку этого запроса. Аутентифицируйте до открытия соединения с целью или приёма туннеля CONNECT.

После приёма учётных данных израсходуйте собственный заголовок Proxy-Authorization прокси перед обычной пересылкой. Сохраните исходное поле Authorization для источника. Вышестоящему родительскому прокси, если он есть, нужна собственная продуманная схема аутентификации, а не случайное получение этих клиентских учётных данных.

Похожие статьи