2016-10-31 9 views
1

oauth2を使用してサードパーティのAPIにアクセスしています。私はアクセストークンを手に入れることができますが、リクエストヘッダーにベアラトークンを渡してAPIを呼び出そうとすると、401(Unauthorized)エラーが出ます。それは、私がPOSTMAN経由で(ヘッダーを(許可:ベアラー)として渡すことによってそれをしようとするとうまくいくが)。しかし、それを使用して動作しません。GolangのGETリクエストのヘッダにベアラトークンを渡すことができません

ここにコードサンプルがあります。

url := "http://api.kounta.com/v1/companies/me.json" 

var bearer = "Bearer " + <ACCESS TOKEN HERE> 
req, err := http.NewRequest("GET", url, nil) 
req.Header.Add("authorization", bearer) 

client := urlfetch.Client(context) 

resp, err := client.Do(req) 
if err != nil { 
panic(err) 
} 
defer resp.Body.Close() 

body, _ := ioutil.ReadAll(resp.Body) 
writer.Write([]byte(body)) // Gives 401 Unauthorized error, though same works using POSTMAN 
+0

ヘッダを 'Add()'するのではなく 'Set()'しようとしましたか? ['Add()'](https://golang.org/pkg/net/http/#Header.Add)は既存のヘッダーに値を付加しますが、['Set()'](https://golang.org /pkg/net/http/#Header.Set)は、既存のヘッダーを上書きします。また、RFCのヘッダーフィールドには大文字と小文字は区別されませんが、一部の言語(PHPなど)はそのことを知らず、 'Authorization'を探しています... – Havelock

+0

@Havelock:go textprotoパッケージは、それら。 – JimB

+0

@TahirRauf:ヘッダーを見て、送信方法を確認しましたか? – JimB

答えて

3

私はこの問題を解決できました。実際問題は2つの方法でした。

1)APIエンドポイントが302の応答を引き起こしていたリダイレクト(302)を実行していて、他のAPIが呼び出されていました。

2)デフォルトでGOがヘッダーを転送しないため、私のベアラートークンが途中で失われていました。

FIX:

私は、クライアントのCheckRedirect機能を無効にし、手動で新しい要求にヘッダを渡す必要がありました。

client.CheckRedirect = checkRedirectFunc 

ここでは、手動でヘッダーを転送した方法を示します。

func checkRedirectFunc(req *http.Request, via []*http.Request) error { 
    req.Header.Add("Authorization", via[0].Header.Get("Authorization")) 
    return nil 
} 
関連する問題