在发出 HTTP 请求时,Go 是否有某种方式将 DefaultNetworkCredentials 与代理一起使用?
Does Go have some way of using DefaultNetworkCredentials with a proxy when making an HTTP request?
我正在编写一个简单的 Go 实用程序,它向互联网发出一些 POST 请求,但我需要通过代理并在不知道用户凭据的情况下使用 NTLM。我见过如下 CSharp 代码:
wc = new CookieWebClient();
wc.UseDefaultCredentials = true;
wc.Proxy = WebRequest.DefaultWebProxy;
wc.Proxy.Credentials = CredentialCache.DefaultNetworkCredentials;
在 Go 中,我已经成功地确定了系统代理,感觉就像一个 hack:
import (
"net/http"
"net/url"
"strings"
"golang.org/x/sys/windows/registry"
)
func getSystemProxy() func(req *http.Request) (*url.URL, error) {
var e error
var k registry.Key
var proxy *url.URL
var v string
// Open the "Internet Settings" registry key
k, e = registry.OpenKey(
registry.CURRENT_USER,
strings.Join(
[]string{
"Software",
"Microsoft",
"Windows",
"CurrentVersion",
"Internet Settings",
},
"\",
),
registry.QUERY_VALUE,
)
if e != nil {
return http.ProxyFromEnvironment
}
defer k.Close()
// Read the "ProxyServer" value
v, _, e = k.GetStringValue("ProxyServer")
if (e != nil) || (v == "") {
return http.ProxyFromEnvironment
}
// Get the http= portion and fix it up
v = strings.Split(v, ";")[0]
v = strings.Replace(v, "=", "://", 1)
// Parse url
if proxy, e = url.Parse(v); e != nil {
return http.ProxyFromEnvironment
}
return http.ProxyURL(proxy)
}
我一直无法找到与 CSharp 的 https://docs.microsoft.com/en-us/dotnet/api/system.net.credentialcache.defaultnetworkcredentials?view=netcore-3.1. I have found https://github.com/Azure/go-ntlmssp 等效的 Go,但这需要我对用户的凭据进行硬编码,而我没有,而且我需要为它编译一个新的二进制文件每个用户,这是我不想做的。我正在寻找 0 配置解决方案。我希望它尽可能动态。 CSharp 能做到,Go 为什么不能?
如有任何帮助,我们将不胜感激!
有人告诉我可以使用 WinHTTP 或 WinInet 来实现此目的。我将使用 golang.org/x/sys/windows
包并从 DLL 调用过程。或者,我被告知我可以使用 github.com/go-ole/go-ole
并通过 COM 对象使用 WinHTTP,就像在另一个 SO 问题中一样:.
更新:我最终决定选择 WinInet,并创建了自己的包 (gitlab.com/mjwhitta/win/wininet),其中包含一个 http.Client,可用于生成 GET 和 POST要求。有关如何使用它的示例,请参阅自述文件。如果我有需要,我可能会在未来扩展它。欢迎提出请求。
最后更新:天哪,我觉得我很愚蠢。 WinInet 不希望为您做 NTLM...所以我将它移植到 WinHttp (gitlab.com/mjwhitta/win/winhttp).
我正在编写一个简单的 Go 实用程序,它向互联网发出一些 POST 请求,但我需要通过代理并在不知道用户凭据的情况下使用 NTLM。我见过如下 CSharp 代码:
wc = new CookieWebClient();
wc.UseDefaultCredentials = true;
wc.Proxy = WebRequest.DefaultWebProxy;
wc.Proxy.Credentials = CredentialCache.DefaultNetworkCredentials;
在 Go 中,我已经成功地确定了系统代理,感觉就像一个 hack:
import (
"net/http"
"net/url"
"strings"
"golang.org/x/sys/windows/registry"
)
func getSystemProxy() func(req *http.Request) (*url.URL, error) {
var e error
var k registry.Key
var proxy *url.URL
var v string
// Open the "Internet Settings" registry key
k, e = registry.OpenKey(
registry.CURRENT_USER,
strings.Join(
[]string{
"Software",
"Microsoft",
"Windows",
"CurrentVersion",
"Internet Settings",
},
"\",
),
registry.QUERY_VALUE,
)
if e != nil {
return http.ProxyFromEnvironment
}
defer k.Close()
// Read the "ProxyServer" value
v, _, e = k.GetStringValue("ProxyServer")
if (e != nil) || (v == "") {
return http.ProxyFromEnvironment
}
// Get the http= portion and fix it up
v = strings.Split(v, ";")[0]
v = strings.Replace(v, "=", "://", 1)
// Parse url
if proxy, e = url.Parse(v); e != nil {
return http.ProxyFromEnvironment
}
return http.ProxyURL(proxy)
}
我一直无法找到与 CSharp 的 https://docs.microsoft.com/en-us/dotnet/api/system.net.credentialcache.defaultnetworkcredentials?view=netcore-3.1. I have found https://github.com/Azure/go-ntlmssp 等效的 Go,但这需要我对用户的凭据进行硬编码,而我没有,而且我需要为它编译一个新的二进制文件每个用户,这是我不想做的。我正在寻找 0 配置解决方案。我希望它尽可能动态。 CSharp 能做到,Go 为什么不能?
如有任何帮助,我们将不胜感激!
有人告诉我可以使用 WinHTTP 或 WinInet 来实现此目的。我将使用 golang.org/x/sys/windows
包并从 DLL 调用过程。或者,我被告知我可以使用 github.com/go-ole/go-ole
并通过 COM 对象使用 WinHTTP,就像在另一个 SO 问题中一样:
更新:我最终决定选择 WinInet,并创建了自己的包 (gitlab.com/mjwhitta/win/wininet),其中包含一个 http.Client,可用于生成 GET 和 POST要求。有关如何使用它的示例,请参阅自述文件。如果我有需要,我可能会在未来扩展它。欢迎提出请求。
最后更新:天哪,我觉得我很愚蠢。 WinInet 不希望为您做 NTLM...所以我将它移植到 WinHttp (gitlab.com/mjwhitta/win/winhttp).