【问题标题】:Not able to pass Bearer token in headers of a GET request in Golang无法在 Golang 的 GET 请求的标头中传递 Bearer 令牌
【发布时间】:2016-12-04 13:53:55
【问题描述】:

我正在使用 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

【问题讨论】:

  • 您是否尝试过 Set() 标头而不是 Add()ing 它? Add() 将值附加到现有标头,而Set() 将覆盖现有标头。同样根据 RFC 标头字段不区分大小写,但某些语言(即 PHP)不知道这一点,将寻找 Authorization...
  • @Havelock: go textproto 包在你设置它们时规范化所有标题。
  • @TahirRauf:您查看了标头以了解它们是如何发送的吗?

标签: go oauth2


【解决方案1】:

我能够解决问题。其实问题出在两个方面。

1) API 端点正在执行重定向 (302),这导致了 302 响应,然后调用了另一个 API。

2) GO 默认不转发标头,因此我的不记名令牌在中间丢失了。

修复:

我必须重写客户端的 CheckRedirect 函数并手动将标头传递给新请求。

client.CheckRedirect = checkRedirectFunc

这是我手动转发标题的方式。

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

【讨论】:

    猜你喜欢
    • 2017-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-11
    • 1970-01-01
    • 2020-05-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多