В чем разница между cURL и моими запросами Go? - PullRequest
0 голосов
/ 20 января 2019

Я пытаюсь повторить несколько запросов http, которые были выполнены с использованием cURL, с помощью Go.

В первом запросе я получаю cookie с именем "yandexuid":

$ curl --cookie-jar jar --output /dev/null \
https://oauth.yandex.ru/...&client_id=ID

Затем я делаю POST с данными аутентификации:

$ curl -v --cookie jar --cookie-jar jar \
    --data 'login=LOGIN' \
    --data 'passwd=PASS' \
    --data 'twoweeks=no' \
    --data 'retpath=https://oauth.yandex.ru/...type=token' \
    https://passport.yandex.ru/auth?...&mode=qr

Возвращает много новых файлов cookie, которые будут использоваться на следующем шаге.

Когда я пытаюсь сделать это с помощью Go, первая часть работает нормально: приходит файл cookie «yandexuid», и я прикрепляю его к следующему запросу. Но второй запрос не возвращает куки. Сервер отвечает мне страницей перенаправления, на которой написано: « Ошибка обработки запроса. Произошла ошибка. Чтобы правильно войти в Яндекс, необходимо включить файлы cookie в настройках браузера. "

Мой код Go:

type Client struct {
    HTTPClient      *http.Client
    CookieJar       []http.Cookie
}

func (c* Client) AddCookies(cookies []*http.Cookie) {
    for _, f := range cookies {
        c.CookieJar = append(c.CookieJar, *f)
    }
}

func (c *Client) Request(method string, request string, body io.Reader) *http.Response {
    req, err := http.NewRequest(method, request, body)

    for _, f := range c.CookieJar {
         req.AddCookie(&f) //attach cookies saving in Client structure
    }

    req.Header.Set("X-Org-id", CompanyID)
    req.Header.Set("Cache-Control", "no-cache")

    resp, err := c.HTTPClient.Do(req)
    return resp
}

func main() {
    // first request
    _url := fmt.Sprintf(https://oauth.yandex.ru/...&client_id=%s, ClientID)
    resp := c.Request("GET", _url, nil)
    c.AddCookies(resp.Cookies()) // getting cookies from respond and saving it in Client structure

    // second request
    PostData := strings.NewReader("login="+email+"&passwd="+pass+"&twoweeks=no&retpath=https://oauth.yandex.ru/...type=token")
resp = c.Request("POST", "https://passport.yandex.ru/auth?...&mode=qr", PostData) 
}

В чем разница между cURL и моими запросами Go? Я знаю, что что-то не так с файлами cookie, и в результате сервер считает, что браузер пользователя не сохраняет файлы cookie.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...