如何获取谷歌oauth的访问令牌?

我正在使用C#(ASP.NET)。 我想使用Google oauth访问我的应用中的用户个人资料详情。 我成功获得了授权码,但在获取访问令牌时遇到了问题。 我更喜欢Google教程 。 在教程中,我读到我必须发送请求并从谷歌获得响应。 为此,我使用System.Net.HttpWebRequest/HttpWebResponse (我是以正确的方式)。 我用这个代码….

 byte[] buffer = Encoding.ASCII.GetBytes("?code=" + code + "&client_id=xxx&client_secret=xxx&redirect_uri=xxxx&grant_type=authorization_code"); HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://accounts.google.com"); req.Method = "POST"; req.ContentType = "application/x-www-form-urlencoded"; req.ContentLength = buffer.Length; Stream strm = req.GetRequestStream(); strm.Write(buffer, 0, buffer.Length); strm.Close(); HttpWebResponse resp = (HttpWebResponse)req.GetResponse(); Response.Write(((HttpWebResponse)resp).StatusDescription); 

但是,我收到了错误:

远程服务器返回错误:(405)方法不允许。

更新:此处变量code是授权代码。

我认为您将POST请求发送到错误的端点,正确的是https://accounts.google.com/o/oauth2/token

由于我在实施Google身份validation的过程中遇到了类似的问题,我将发布有效的代码..最后提到的问题:错误(400)错误的请求可能是由导致’?’引起的 在上面的代码..

  string codeClient = "code="+ t +"&client_id=number.apps.googleusercontent.com&"; string secretUri = "client_secret=yoursecret&" + "redirect_uri=path&" + "grant_type=authorization_code"; postString = codeClient + secretUri; string url = "https://accounts.google.com/o/oauth2/token"; HttpWebRequest request = (HttpWebRequest) WebRequest.Create(url.ToString()); request.Method = "POST"; request.ContentType = "application/x-www-form-urlencoded"; UTF8Encoding utfenc = new UTF8Encoding(); byte[] bytes = utfenc.GetBytes(postString); Stream os = null; try { request.ContentLength = bytes.Length; os = request.GetRequestStream(); os.Write(bytes, 0, bytes.Length); } catch { } try { HttpWebResponse webResponse = (HttpWebResponse) request.GetResponse(); Stream responseStream = webResponse.GetResponseStream(); StreamReader responseStreamReader = new StreamReader(responseStream); result = responseStreamReader.ReadToEnd();//parse token from result 

我的代码正在运行,我在上面的两行中犯了错误。 它应该是这样的

 byte[] buffer = Encoding.ASCII.GetBytes("code=" + code + "&client_id=xxx&client_secret=xxx&redirect_uri=xxxx&grant_type=authorization_code"); HttpWebRequest req = (HttpWebRequest)WebRequest.Create("https://accounts.google.com/o/oauth2/token"); 

剩下的代码是正确的。

原始请求似乎有点过时了。 但我发现Google的代码示例中包含许多“最佳实践”内务代码,这些代码很难与基本操作分开。

我最近发布了一个文档,它将所有REST操作表示为curl命令。 在每种语言中都很难熟悉,但curl似乎是普遍的。 大多数人都知道 – 否则,它很容易掌握。 在我的curl示例中, -d标志表示POST操作。 否则,参数将附加到URL。

http://www.tqis.com/eloquency/googlecalendar.htm

 public string ReceiveTokenGmail(string code, string GoogleWebAppClientID, string GoogleWebAppClientSecret, string RedirectUrl) { string postString = "code=" + code + "&client_id=" + GoogleWebAppClientID + @"&client_secret=" + GoogleWebAppClientSecret + "&redirect_uri=" + RedirectUrl; string url = "https://accounts.google.com/o/oauth2/token"; HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url.ToString()); request.Method = "POST"; request.ContentType = "application/x-www-form-urlencoded"; UTF8Encoding utfenc = new UTF8Encoding(); byte[] bytes = utfenc.GetBytes(postString); Stream os = null; try { request.ContentLength = bytes.Length; os = request.GetRequestStream(); os.Write(bytes, 0, bytes.Length); } catch { } string result = ""; HttpWebResponse webResponse = (HttpWebResponse)request.GetResponse(); Stream responseStream = webResponse.GetResponseStream(); StreamReader responseStreamReader = new StreamReader(responseStream); result = responseStreamReader.ReadToEnd(); return result; }