2016-10-31 34 views
1

我正在使用oauth2访问第三方API。我可以获取访问令牌,但是当我尝试通过在请求头中传递不记名令牌来调用API时,它会给我401(未授权)错误。虽然当我尝试通过POSTMAN传递标头(Authorization:Bearer)来实现时效果很好。但是它不起作用。无法在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()'](https://golang.org/pkg/net/http/#Header.Add)附加值到现有的头部,而['Set()'](https://golang.org /pkg/net/http/#Header.Set)会覆盖现有的标题。另外根据RFC标头字段不区分大小写,但一些语言(即PHP)不知道这一点,并将寻找'Authorization' ... – Havelock

+0

@Havelock:去设置textproto包当您设置所有标头时他们。 – JimB

+0

@TahirRauf:你看过标题,看看它们是如何被发送的? – JimB

回答

3

我能解决问题。其实问题是双向的。

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 
}