Аутентифицированные клиентские запросы 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) правильно получает данные с сервера, поэтому я знаю, что на стороне сервера все в порядке. Нужно ли передавать какую-то строку сеанса или что-то, что мы получили в предыдущем запросе?
Ответы
Ответ 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
Идентификаторы аутентификации для последующего использования.
Ответ 3
Существует новая официальная библиотека, возможно, это полезно.
http://golang.org/pkg/net/http/cookiejar/
Пример:
Голан: как следить за местоположением с помощью файла cookie