web-dev-qa-db-ja.com

golangからの認証済みHTTPクライアントリクエスト

私は次のコードを持っています:

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)
}

現在、2番目のhttp呼び出しは401アクセス拒否エラーで失敗しています。別のRESTクライアント(firefoxプラグイン)はサーバーから詳細を正しく取得するので、サーバー側では何も問題がないことを知っています。何らかのセッション文字列または何かを渡す必要がありますか前のリクエストで得たものですか?

29
Sankar

はい。これを解決しました。クッキージャーを作成する必要がありました。

これが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

動作します。

20
Sankar

HTTP基本認証では、すべてのリクエストに資格情報が必要です。コピーしてみてください

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

2番目のclient.Do(req)の前の行。

Firefoxプラグインが詳細を取得する理由は、ブラウザがその後の使用のためにHTTP基本認証トークンをキャッシュするためです。

12
Mike Reedell

新しい公式ライブラリがあります。これは役に立つかもしれません。

http://golang.org/pkg/net/http/cookiejar/

例: Golang:Cookieで場所を追跡する方法

4
Daniel YC Lin