在 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。它返回解析出的值和解析成功标志;它并不校验账号。请把结果交给代理原本的凭据校验逻辑。

如果认证失败,就返回 带有合适 Proxy-Authenticate 质询的 407,并停止处理该请求。在打开到目标站的连接或接受 CONNECT 隧道之前完成认证。

接受凭据之后,在正常转发前先消费掉代理自己的 Proxy-Authorization 头。为源站保留原始 Authorization 字段。如果存在上游父代理,它需要自己的一套经过考量的认证安排,而不是误收这个客户端凭据。

相关文章