Подтвердить что ты не робот

Аутентифицированные клиентские запросы http от golang

У меня есть следующий код:

client := &http.Client{}

/* Authenticate */
req, err := http.NewRequest("GET", "http://164.99.113.32/Authenticate", nil)
req.SetBasicAuth("<username>","<password>")
resp, err := client.Do(req)
if err != nil {
    fmt.Printf("Error : %s", err)
}

/* Get Details */
req.URL, _ = url.Parse("http://164.99.113.32/Details")
resp, err = client.Do(req)
if err != nil {
    fmt.Printf("Error : %s", err)
}

Теперь второй вызов http завершается с ошибкой 401, запрещающей доступ. Другой клиент REST (плагин Firefox) правильно получает данные с сервера, поэтому я знаю, что на стороне сервера все в порядке. Нужно ли передавать какую-то строку сеанса или что-то, что мы получили в предыдущем запросе?

4b9b3361

Ответ 1

Хорошо. Я решил это. Мне просто нужно было создать куклу cookie.

Я удивлен, что по умолчанию это не обрабатывается golang http req/client.

Код, который я должен был использовать, был:

type myjar struct {
    jar map[string] []*http.Cookie
}

func (p* myjar) SetCookies(u *url.URL, cookies []*http.Cookie) {
    fmt.Printf("The URL is : %s\n", u.String())
    fmt.Printf("The cookie being set is : %s\n", cookies)
    p.jar [u.Host] = cookies
}

func (p *myjar) Cookies(u *url.URL) []*http.Cookie {
    fmt.Printf("The URL is : %s\n", u.String())
    fmt.Printf("Cookie being returned is : %s\n", p.jar[u.Host])
    return p.jar[u.Host]
}

а затем в основном:

    jar := &myjar{}
    jar.jar = make(map[string] []*http.Cookie)
    client.Jar = jar

Works.

Ответ 2

При базовой аутентификации HTTP учетные данные необходимы для каждого запроса. Попробуйте скопировать

req.SetBasicAuth("<username>", "<password>")

перед вторым клиентом .Do(req).

Причина, по которой плагин Firefox получает информацию, заключается в том, что браузер будет кэшировать HTTP Basic Идентификаторы аутентификации для последующего использования.