Go 是否有某种方式在发出 HTTP 请求时通过代理使用 DefaultNetworkCredentials ?

问题描述 投票:0回答:1

我正在编写一个简单的 Go 实用程序,它向互联网发出一些 POST 请求,但我需要通过代理并在不知道用户凭据的情况下使用 NTLM。我见过如下的 CSharp 代码:

wc = new CookieWebClient();
wc.UseDefaultCredentials = true;
wc.Proxy = WebRequest.DefaultWebProxy;
wc.Proxy.Credentials = CredentialCache.DefaultNetworkCredentials;

在 Go 中,我成功地确定了系统代理,感觉就像是黑客攻击:

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 的 Go https://learn.microsoft.com/en-us/dotnet/api/system.net.credentialcache.defaultnetworkcredentials?view=netcore-3.1。我找到了 https://github.com/Azure/go-ntlmssp 但这需要我对用户的凭据进行硬编码,而我没有,并且我需要为每个用户编译一个新的二进制文件,这我不想做。我正在寻找 0 配置解决方案。我希望它尽可能动态。如果 CSharp 能做到,为什么 Go 不能?

任何帮助将不胜感激!

go http-proxy ntlm defaultnetworkcredentials
1个回答
1
投票

我被告知可以使用 WinHTTP 或 WinINet 来实现此目的。我将使用

golang.org/x/sys/windows
包并从 DLL 中调用过程。或者,我被告知我可以使用
github.com/go-ole/go-ole
并通过 COM 对象使用 WinHTTP,就像在另一个 SO 问题中一样:Go HTTP NTLM 请求中的 Windows 系统凭据

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

更新(2024-04-17):我的原始模块(github.com/mjwhitta/win)包含 WinHTTP 和 WinINet 实现。我现在创建了一个新模块 (github.com/mjwhitta/inet),其中包含一个最小的跨平台 HTTP 客户端接口,因此您不再需要担心代码运行的操作系统。在 Windows 上,它默认为 WinINet,但可以配置为使用 WinHTTP 或 net/http。在其他操作系统上,它仅使用 net/http。请参阅自述文件以获取示例。

© www.soinside.com 2019 - 2024. All rights reserved.