Как мне авторизовать пользователя: пройти прокси в golang

Я пытаюсь использовать прокси-сервер user:pass в моем запросе в golang, и я получаю «требуется аутентификация прокси», когда запускаю его.

вот мой код:

var ip string = "123.45.67.890:54400:user:pass"

func main() {

    proxy := "http://" + ip
    proxyURL, err := url.Parse(proxy)
    if err != nil {
        log.Fatal(err)
    }

    urlStr := site
    url, err := url.Parse(urlStr)
    if err != nil {
        log.Fatal(err)
    }

    transport := &http.Transport{
        Proxy: http.ProxyURL(proxyURL),
    }

    jar, _ := cookiejar.New(nil)

    client := &http.Client{
        Jar:       jar,
        Transport: transport,
    }

    req, _ := http.NewRequest("GET", url.String(), nil)
    if err != nil {
        log.Fatal(err)
    }

    auth := "johndoe2x:johndoe2x"
    basicAuth := "Basic " + base64.StdEncoding.EncodeToString([]byte(auth))
    req.Header.Add("Proxy-Authorization", basicAuth)
    req.Header.Add("accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9")
    req.Header.Add("accept-language", "en-US,en;q=0.9")
    req.Header.Add("upgrade-insecure-requests", "1")
    req.Header.Add("user-agent", userAgent)

    res, err := client.Do(req)
    if err != nil {
        log.Fatal(err)
    }

    log.Println("statusCode:", res.StatusCode)
    
    data, err := ioutil.ReadAll(res.Body)
    if err != nil {
        log.Fatal(err)
    }
    log.Println(string(data))

}

Опять же, когда я запускаю это, я получаю Time_here Get "https://site_here/": Proxy Authentication Required Я застрял на этом на несколько часов, и я точно не знаю, как это сделать в Go, я смог сделать это в JS с var для пользователя и пройти, но этот вызывает у меня некоторые проблемы в Голанге

Заранее спасибо!


person Salvatore Timpani    schedule 24.09.2020    source источник


Ответы (1)


Вы добавляете заголовки аутентификации прокси-сервера в запрос, который будет отправлен на целевой сервер. Что вам нужно сделать, так это добавить этот заголовок в transport.

Замените req.Header.Add("Proxy-Authorization", basicAuth) на

transport.ProxyConnectHeader = http.Header{}
transport.ProxyConnectHeader.Add("Proxy-Authorization", basicAuth)
person Emanuel Bennici    schedule 24.09.2020
comment
круто, авторизация тоже := `` johndoe2x:johndoe2x `` правильно или мне следует использовать auth := `` user:pass `` - person Salvatore Timpani; 24.09.2020
comment
Основной синтаксис аутентификации: base64(username:password) - person Emanuel Bennici; 24.09.2020
comment
да, но действительно ли я ввожу имя пользователя и пароль в эти поля или набираю username:password - person Salvatore Timpani; 24.09.2020
comment
Вы заменяете эти поля либо именем пользователя, либо паролем. - person Emanuel Bennici; 24.09.2020