Google Api' Exchange授权码'返回未经授权

时间:2018-04-20 13:17:42

标签: .net asp.net-core google-api google-drive-api asp.net-core-2.0

我正在尝试按照本教程的步骤从Google Api获取身份验证令牌:https://developers.google.com/identity/protocols/OAuth2WebServer#exchange-authorization-code

我正在向api发送一个http post请求,如上面教程的第5步所述。 跟着我的代码:

List<KeyValuePair<string, string>> postData = new List<KeyValuePair<string, string>>();
                    postData.Add(new KeyValuePair<string, string>("code", code));
                    postData.Add(new KeyValuePair<string, string>("client_id", "XXX"));
                    postData.Add(new KeyValuePair<string, string>("client_secret", "XXX"));
                    postData.Add(new KeyValuePair<string, string>("redirect_uri", "XXX"));
                    postData.Add(new KeyValuePair<string, string>("grant_type", "authorization_code"));
    using (var httpClient = new HttpClient())
                    {
                        client.DefaultRequestHeaders.Accept.Clear();
                        client.DefaultRequestHeaders.Add("Contenttype", "application/x-www-form-urlencoded");
                        using (var content = new FormUrlEncodedContent(postData))
                        {
                            content.Headers.Clear();
                            content.Headers.ContentType = new MediaTypeHeaderValue("application/x-www-form-urlencoded");
                            HttpResponseMessage response = await httpClient.PostAsync("https://www.googleapis.com/oauth2/v4/token", content);


                            //var response = (await client.PostAsync(gh, content));//encodedContent));
                            if (response.IsSuccessStatusCode)
                            {
                                string res = await response.Content.ReadAsStringAsync();
                                var obj = Newtonsoft.Json.JsonConvert.DeserializeObject<dynamic>(res);
                            }
                        }
                    }

它将给我一个401&#39; Unauthorized&#39;响应。

    {StatusCode: 401, ReasonPhrase: 'Unauthorized', Version: 1.1, Content: System.Net.Http.NoWriteNoSeekStreamContent, Headers:
{
  Cache-Control: max-age=0, private
  Date: Fri, 20 Apr 2018 13:11:01 GMT
  Transfer-Encoding: chunked
  Accept-Ranges: none
  Server: GSE
  Vary: X-Origin
  Vary: Origin
  Vary: Accept-Encoding
  WWW-Authenticate: Bearer realm="https://accounts.google.com/"
  X-Content-Type-Options: nosniff
  X-Frame-Options: SAMEORIGIN
  X-XSS-Protection: 1; mode=block
  Alt-Svc: hq=":443"; ma=2592000; quic=51303433; quic=51303432; quic=51303431; quic=51303339; quic=51303335,quic=":443"; ma=2592000; v="43,42,41,39,35"
  Content-Type: application/json; charset=UTF-8
  Expires: Fri, 20 Apr 2018 13:11:01 GMT
}}

以下是发布请求的标题:

    POST /oauth2/v4/token HTTP/1.1
Connection: Keep-Alive
Content-Type: application/x-www-form-urlencoded
x-ms-request-root-id: 60d8427e-4efe61d8a3b25e96
x-ms-request-id: |60d8427e-4efe61d8a3b25e96.1.
Request-Id: |60d8427e-4efe61d8a3b25e96.1.1.
Content-Length: 322
Host: www.googleapis.com

我是从我的应用程序从http://localhost:1083端口发送此请求的,我已将此网址添加到授权网址中。 我知道它有点模棱两可的错误消息,但我厌倦了打击和试验并且卡在这里。 我正在使用.net核心2。 我甚至试图点击&#34; http://www.googleapis.com/oauth2/v4/token&#34; (没有ssl)和它们返回403 Forbidden error。

1 个答案:

答案 0 :(得分:0)

将我的头撞在墙上6个小时后,我逐一解决了以下问题:

  1. 我在本文第5步的请求中使用了不同的client_id。我必须使用与步骤2中使用的客户端ID相同的客户端ID。

  2. 同意屏幕仍然使用错误的client_id。我不得不清除缓存。

  3. 我们必须在第2步中使用的文章的第5步中使用相同的redirect_uri。这是最重要的问题。我一直在&#39; redirect_uri_mismatch&#39;由于这个问题。

  4. 希望这会对某人有所帮助。