使用 auth 访问 http 代理
Posted
技术标签:
【中文标题】使用 auth 访问 http 代理【英文标题】:Go http proxy with auth 【发布时间】:2018-12-13 00:03:12 【问题描述】:我需要使用带有身份验证的代理,使用 PostForm 方法。 如果我使用类似(简化)的东西:
request, err := http.NewRequest("GET", url.String(), nil)
response, err := client.Do(request)
我可以轻松地做request.Header.Add("Proxy-Authorization", basicAuth)
,而且效果很好。
但是现在,我正在编辑第三方包,并尝试在现有代码中添加代理:
proxyStr := "http://proxy.com:8080"
proxyURL, _ := url.Parse(proxyStr)
transport := &http.Transport
Proxy: http.ProxyURL(proxyURL),
bot.Client = &http.Client
Transport: transport,
resp, err := bot.Client.PostForm(method, params)
auth := "username:password"
basicAuth := "Basic " + base64.StdEncoding.EncodeToString([]byte(auth))
resp.Header.Add("Proxy-Authorization", basicAuth)
在我看来,它不起作用,并且在字符串resp.Header.Add("Proxy-Authorization", basicAuth)
处失败。
在此示例中,没有身份验证的代理可以正常工作。
有谁知道,在这种情况下我可以使用代理和身份验证吗?
【问题讨论】:
您将授权标头添加到响应中,而不是请求中。 【参考方案1】:您可以使用以下代码创建一次客户端。然后在第三方包中替换您的 HTTP 客户端。
&http.Client
Transport: &http.Transport
Proxy: http.ProxyURL(&url.URL
Scheme: "http",
User: url.UserPassword("username", "password"),
Host: "146.137.9.45:65233",
),
,
或者你也可以解析 URL
url, _ := url.Parse("http://username:password@146.137.9.45:65233")
&http.Client
Transport: &http.Transport
Proxy: http.ProxyURL(url),
【讨论】:
【参考方案2】:您正在尝试向响应添加标头,这不是您发送到服务器的内容,而是您收到的内容。您必须向请求中添加标头和数据,您必须先组装它们,然后像这样执行它:
data := url.Values // the form data
data.Add("foo-key", "some data")
req, err := http.NewRequest("POST","https://yoururl", strings.NewReader(data.Encode()))
auth := "username:password"
basicAuth := "Basic " + base64.StdEncoding.EncodeToString([]byte(auth))
req.Header.Add("Proxy-Authorization", basicAuth)
req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
resp, err := bot.Client.Do(req)
那你就用回复(resp
)
【讨论】:
【参考方案3】:谢谢大家!
我找到了这样的解决方案(可能对某人有用):
// Uncomment to use proxy with auth
/*
proxyStr := "http://proxy.com:3128"
proxyURL, _ := url.Parse(proxyStr)
auth := "username:password"
basicAuth := "Basic " + base64.StdEncoding.EncodeToString([]byte(auth))
hdr := http.Header
hdr.Add("Proxy-Authorization", basicAuth)
transport := &http.Transport
Proxy: http.ProxyURL(proxyURL),
ProxyConnectHeader: hdr,
bot.Client = &http.Client
Transport: transport,
*/
resp, err := bot.Client.PostForm(method, params)
【讨论】:
以上是关于使用 auth 访问 http 代理的主要内容,如果未能解决你的问题,请参考以下文章
http fetch basic auth - 使用浏览器凭据
使用 Auth 将 pfsense Squid 代理连接到父 Bluecoat