缺少Youtube API无效的Grant和Required参数:grant_type

时间:2014-08-22 16:40:59

标签: curl oauth go youtube-api

我无法通过OAuth使用Youtube API进行身份验证。它给了我这个错误:

  • “错误”: CURL
  • 的“invalid_grant”
  • “error”:“invalid_request”,
    “error_description”:“ GoLang
  • ”缺少必需参数:grant_type“

这是我的CURL代码:

curl -i -X POST "https://accounts.google.com/o/oauth2/token" \ -F 'code=CODE_FROM_MY_USER' \ -F 'client_id=MY_CLIENT_ID' \ -F 'client_secret=MY_CLIENT_SECRET' \ -F 'redirect_uri=http://localhost:8080/platform/youtubeCallback.html' \ -F 'grant_type=authorization_code'

这是我的Go代码,已经过验证可用于Soundcloud API。

func Auth(code string) err {
    v := url.Values{}
    v.Set("code", code)
    v.Set("client_id", "MY_CLIENT_ID")
    v.Set("client_secret", "MY_CLIENT_SECRET")
    v.Set("redirect_uri", "http://localhost:8080/platform/youtubeCallback.html")
    v.Set("grant_type", "authorization_code")

    params := strings.NewReader(v.Encode())

    req, err := http.NewRequest("POST", "https://accounts.google.com/o/oauth2/token", params)
    if err != nil {
        return err
    }
    req.Header.Add("Accept", "application/json")

    resp, err := c.Client.Do(req)
    if err != nil || resp.StatusCode != 200 {
        return err
    }

    json.NewDecoder(resp.Body).Decode(&c.Token)

    return nil
}

2 个答案:

答案 0 :(得分:2)

事实证明,您需要定义内容类型:

req.Header.Set(“Content-Type”,“application / x-www-form-urlencoded”)

答案 1 :(得分:1)

如果您创建map[string][]string并将其传递给url.Values,它也会有效:

namesToSend := map[string][]string{
  "firstname":{Bob}
}
values := url.Values{}
values = namesToSend

然后在.NewRequest()你传递它就像你通过了参数。

req, err := http.NewRequest("POST", "https://accounts.google.com/o/oauth2/token", values)
if err != nil {
    return err
}