【问题标题】:Google API token endpoint POST returns Bad Request 400Google API 令牌端点 POST 返回错误请求 400
【发布时间】:2015-03-01 19:07:50
【问题描述】:

我正在尝试用一次性 Google Plus 授权码换取访问令牌。但我不断收到 400 Bad Request。我正在使用 VB.NET。代码如下:

        'We should now have a "good" one-time authorization code stored in "code"
    Using Client As New WebClient()
        'Dim Client As New WebClient()
        Dim values As New NameValueCollection()
        Dim Resp
        Dim responseString As String

        values("code") = Request.QueryString("code")
        values("client_id") = ConfigurationManager.AppSettings("google.clientid")
        values("client_secret") = ConfigurationManager.AppSettings("google.clientsecret")
        values("grant_type") = "authorization_code"
        values("redirect_uri") = "http://localhost:3333/MyVacations/default.aspx"
        Resp = Client.UploadValues("https://www.googleapis.com/oauth2/v3/token", values)
        responseString = Encoding.Default.GetString(Resp)
    End Using

我很确定这是我应该使用的端点 https://www.googleapis.com/oauth2/v3/token 但谁知道呢? Google Discovery Document 只是让我感到困惑。

还请原谅我的天真,但有人能解释一下 Google 用作示例的 POST 代码与我上面代码中的 Web 请求有何关系吗?我想我理解这些值是如何转换的,但是 POST 中的 3 个标题行(如下)......这是如何在 VB 代码中指定的?我遗漏了一些对其他人来说必须非常明显的东西,所以如果你知道,请告诉我。

POST /oauth2/v3/token HTTP/1.1
Host: www.googleapis.com
Content-Type: application/x-www-form-urlencoded

code=4/P7q7W91a-oMsCeLvIaQm6bTrgtp7&
client_id=8819981768.apps.googleusercontent.com&
client_secret={client_secret}&
redirect_uri=https://oauth2-login-demo.appspot.com/code&
grant_type=authorization_code

另一个Stack Overflow Post 提到了将数据作为查询参数发送(我猜使用'&')而不是作为请求标头发送数据,那么沿 NameValueCollection 发送有什么问题吗?

【问题讨论】:

  • 您的redirect_uri 是否与用于获取授权码的值匹配?
  • 根据 POST 返回的响应,我得到一个 uri_redirect_mismatch,所以你是对的。但是我已经将 URL 直接从开发者控制台复制并粘贴到我的代码中,反之亦然,所以我不知道为什么会发生这种情况。

标签: api authentication google-api authorization bad-request


【解决方案1】:

答案是:API 需要 2 次调用。第一次调用返回一次性授权码。第一次调用必须指定一个重定向 URI。

第二次调用将一次性代码发送到 API 以获取授权令牌。此 POST 还需要重定向 URI。

第一次调用的重定向 URI 必须与第二次调用的重定向 URI 相同!!!

我无法在文档中的任何地方找到它。请记住,此 URI 还必须与开发人员控制台中列表中的 URI 之一匹配,这是所有文档中所说的。

【讨论】:

  • 是的,如果他们在文档中提到这一点会很好。感谢您发布此内容...
猜你喜欢
  • 1970-01-01
  • 2017-11-08
  • 2013-07-21
  • 2012-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-02
  • 1970-01-01
相关资源
最近更新 更多