【问题标题】:Does Go have some way of using DefaultNetworkCredentials with a proxy when making an HTTP request?在发出 HTTP 请求时,Go 是否有某种方式使用 DefaultNetworkCredentials 和代理?
【发布时间】:2020-10-22 16:29:03
【问题描述】:

我正在编写一个简单的 Go 实用程序,该实用程序向 Internet 发出一些 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 等效的 Go。我找到了https://github.com/Azure/go-ntlmssp,但这需要我对我没有的用户凭据进行硬编码,并且我需要为每个用户编译一个新的二进制文件,而我不想这样做。我正在寻找 0 配置解决方案。我希望这尽可能动态。如果 CSharp 能做到,为什么 Go 不能?

任何帮助将不胜感激!

【问题讨论】:

  • 如果您选择硬编码值,您只需为每个用户制作一个二进制文件。您可以从 CLI、环境变量或配置文件中轻松获取它们。该库没有“要求”您对凭据进行硬编码。
  • 是的,但我想我会选择 0 配置。我应该能够将它提供给用户,它应该可以正常工作。我可以用 CSharp 做到这一点。我希望使用 Go。
  • @ErkinDjindjiev:我有。该链接在我上面的问题中。它不起作用。我不知道用户的信誉,我正在寻找 0 配置答案。最初我最终使用了 WinHTTP,它运行得非常好。我已经切换到 WinInet 作为我的最终答案。

标签: go http-proxy ntlm defaultnetworkcredentials


【解决方案1】:

有人告诉我我可以使用 WinHTTP 或 WinInet 来实现这一点。我将使用golang.org/x/sys/windows 包并从DLL 中调用过程。或者,有人告诉我我可以使用 github.com/go-ole/go-ole 并通过 COM 对象使用 WinHTTP,就像在另一个 SO 问题中一样:Windows system credentials in Go HTTP NTLM requests

更新:我最终决定选择 WinInet,并创建了自己的包 (gitlab.com/mjwhitta/win/wininet),其中包含一个 http.Client,可用于发出 GET 和 POST 请求。有关如何使用它的示例,请参阅自述文件。如果我有需要,我可能会在未来扩展它。欢迎请求请求。

最后更新:男孩,我觉得自己很愚蠢。 WinInet 不希望为你做 NTLM...所以我将它移植到 WinHttp (gitlab.com/mjwhitta/win/winhttp)。

【讨论】:

    猜你喜欢
    • 2017-09-02
    • 2023-04-06
    • 2020-01-04
    • 2021-12-03
    • 2021-02-22
    • 1970-01-01
    • 2021-10-27
    • 1970-01-01
    • 2021-04-06
    相关资源
    最近更新 更多