无法在Golang中的GET请求的标头中传递Bearer令牌

时间:2016-10-31 08:29:08

标签: go oauth2

我使用oauth2访问第三方API。我可以获得访问令牌,但是当我尝试通过在请求标头中传递承载令牌来调用API时,它会给我401(未授权)错误。虽然当我尝试通过传递头文件(授权:承载)来通过POSTMAN来做它时效果很好。但是使用go不起作用。

以下是代码示例。

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

1 个答案:

答案 0 :(得分:6)

我能够解决问题。实际上问题是双向的。

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
}