Google AnalyticsAPI - 使用OAuth2和&amp ;;检索刷新令牌ASP.NET

时间:2013-06-12 16:11:58

标签: asp.net google-api oauth-2.0 google-analytics-api google-oauth

我尝试使用OAuth2设置Google AnalyticsAPI应用程序的离线访问权限,并且我使用ASP.NET来发布我的授权代码以换取刷新令牌,但我无法做到从服务器获取响应以给我刷新令牌。

我已经使用MSDN文档中的示例代码来发布请求,所以我只能假设这是正确的,但是我收到错误消息"远程服务器返回错误:( 400)System.Net.HttpWebRequest.GetResponse()"的错误请求:

using System;
using System.IO;
using System.Net;
using System.Text;

WebRequest request = WebRequest.Create ("https://accounts.google.com/o/oauth2/token?code=xxxmyauthorizationcodexxx&client_id=xxxxxxxxx.apps.googleusercontent.com&client_secret=xxxxxxxxxxxx&redirect_uri=https://mysite.com/oauth2callback&grant_type=authorization_code");
request.Method = "POST";
string postData = "code=xxxmyauthorizationcodexxx&client_id=xxxxxxxxx.apps.googleusercontent.com&client_secret=xxxxxxxxxxxx&redirect_uri=https://mysite.com/oauth2callback&grant_type=authorization_code";
byte[] byteArray = Encoding.UTF8.GetBytes (postData);
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = byteArray.Length;

Stream dataStream = request.GetRequestStream ();
dataStream.Write (byteArray, 0, byteArray.Length);
dataStream.Close ();

WebResponse response = request.GetResponse ();
dataStream = response.GetResponseStream ();
StreamReader reader = new StreamReader (dataStream);
string responseFromServer = reader.ReadToEnd ();

reader.Close ();
dataStream.Close ();
response.Close ();

我已成功使用GET方法检索授权代码,并且我已按照此文档:https://developers.google.com/accounts/docs/OAuth2WebServer#handlingtheresponse

我还使用https网站发出请求,并在过期时手动刷新授权码。有没有人有这个问题的解决方案?

编辑:对于遇到相同问题的任何人,请首先查看下面的aeijdenberg的回复,但我的解决方案是我用于代码参数的授权代码非常即时到期 - 我一直刷新我的页面而没有请求新的一。要获取数据,只需显示responseFromServer变量中的内容。

1 个答案:

答案 0 :(得分:3)

看起来你传递了两次参数。进入查询字符串后:

WebRequest request = WebRequest.Create ("https://accounts.google.com/o/oauth2/token?code=xxxx...

然后再次作为POST数据。我建议删除查询字符串,例如直接发布到“https://accounts.google.com/o/oauth2/token”。

如果您还没有这样做,还建议确保所有参数都是URL编码的: http://msdn.microsoft.com/en-us/library/system.web.httputility.urlencode.aspx