无法在 Golang 中的 GET 请求的 headers 中传递 Bearer 令牌
Not able to pass Bearer token in headers of a GET request in Golang
我正在使用 oauth2 访问第三方 API。我可以获得访问令牌,但是当我尝试通过在请求 headers 中传递承载令牌来调用 API 时,它会给我 401(未授权)错误。尽管当我尝试通过将 headers 传递为 (Authorization: Bearer) 通过 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) API 端点正在进行重定向 (302),这导致了 302 响应,然后另一个 API 被调用。
2) 默认情况下 GO 不会转发 headers,因此我的不记名令牌在中间丢失了。
修复:
我不得不覆盖客户端的 CheckRedirect 函数并手动将 headers 传递给新请求。
client.CheckRedirect = checkRedirectFunc
这是我手动转发 headers 的方式。
func checkRedirectFunc(req *http.Request, via []*http.Request) error {
req.Header.Add("Authorization", via[0].Header.Get("Authorization"))
return nil
}
我正在使用 oauth2 访问第三方 API。我可以获得访问令牌,但是当我尝试通过在请求 headers 中传递承载令牌来调用 API 时,它会给我 401(未授权)错误。尽管当我尝试通过将 headers 传递为 (Authorization: Bearer) 通过 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) API 端点正在进行重定向 (302),这导致了 302 响应,然后另一个 API 被调用。
2) 默认情况下 GO 不会转发 headers,因此我的不记名令牌在中间丢失了。
修复:
我不得不覆盖客户端的 CheckRedirect 函数并手动将 headers 传递给新请求。
client.CheckRedirect = checkRedirectFunc
这是我手动转发 headers 的方式。
func checkRedirectFunc(req *http.Request, via []*http.Request) error {
req.Header.Add("Authorization", via[0].Header.Get("Authorization"))
return nil
}