在golang中获取oauth用户令牌400错误?

时间:2017-05-01 13:48:17

标签: api go

我试图获取ebay用户令牌。 我已经在ebay中获得了auth代码,但是无法使用auth代码获取用户令牌。 代码如下:

status := ctx.UserValue("status").(string)
applicationToken := string(ctx.QueryArgs().Peek("code"))
log.Println("ApplicationToken: ", applicationToken)
log.Println("Status: ", status)
if status == "declined" {
    fmt.Printf("User doesn't give permission. Go back to your dashboard.")
    ctx.Redirect("/dashboard", fasthttp.StatusSeeOther)
}

//var appConfig = config.Config()
client := &http.Client{}

applicationTokenURLEncoded, _ := url.Parse(applicationToken)

body := url.Values{
    "grant_type":   {"authorization_code"},
    "code":         {applicationTokenURLEncoded.String()},
    "redirect_uri": {Runame},
}
reqBody := bytes.NewBufferString(body.Encode())
log.Println("Reqbody: ", reqBody)

req, _ := http.NewRequest("POST", "https://api.sandbox.ebay.com/identity/v1/oauth2/token", reqBody)


authorization := “AppID” + ":" + “CertID”
authorizationBase64 := base64.StdEncoding.EncodeToString([]byte(authorization))

req.Header.Add("Authorization", "Basic "+authorizationBase64)
req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
log.Println("Body: ", req)

resp, _ := client.Do(req)
log.Println("resp: ", resp)
log.Println("ResBody: ", resp.Body)

错误就是这样:

Bad Request 400

1 个答案:

答案 0 :(得分:1)

我看起来信息没有正确形成(这就是服务器返回400的原因)。

当您设置标题时,请写下:

req.Header.Add("Authorization", "Basic "+authorizationBase64)
req.Header.Add("Content-Type", "application/x-www-form-urlencoded")

Golang有一种很好的内置方法可以将授权添加到标题SetBasicAuth,这是http.Request的一种方法。

func (r *Request) SetBasicAuth(username, password string)
  

SetBasicAuth将请求的授权标头设置为使用提供的用户名和密码进行HTTP基本身份验证。

     

使用HTTP基本身份验证时,提供的用户名和密码不会加密。

因此,您可以尝试:

,而不是手动设置授权标题
req.SetBasicAuth("AppID”, “CertID”)

您使用的是 CertID ,但我认为您的意思是 ClientId ClientSecret - 分别是用户密码

我不知道这是否是导致问题的原因:)。帮助查明的一种方法是一致的错误检查,请参阅以下行:

applicationTokenURLEncoded, _ := url.Parse(applicationToken)