我在javascript的帮助下获得了授权码。现在在服务器上,我需要交换刷新令牌。这是我的代码。
byte[] buffer = Encoding.ASCII.GetBytes("code=" + "....."
+ "&client_id=.....&client_secret=...&redirect_uri=https%3A%2F%2Fmysite.com%2Fportal%2F&grant_type=authorization_code");
HttpWebRequest req = (HttpWebRequest)WebRequest.Create("https://accounts.google.com/o/oauth2/token");
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();
它引发异常Bad request
,内部异常为null。
更新
我在ASP.NET MVC 4应用程序中使用它。由于它是异步操作,我切换到Visual Studio 2013.我使用await
修改了代码:
UserCredential credential = await GoogleWebAuthorizationBroker.AuthorizeAsync(
GoogleClientSecrets.Load(stream).Secrets,
new[] {
GmailService.Scope.GmailCompose, GmailService.Scope.GmailModify, GmailService.Scope.GmailReadonly
},
"user",
CancellationToken.None
) ;
在此声明中,它会挂起浏览器(类似于this问题)。我尝试了添加日志,没有例外,也没有进一步执行。
答案 0 :(得分:1)
Google身份验证的第一步是响应类型代码。它是一个HTTP GET,基本上只是打开一个新的浏览器窗口。一旦用户接受您的身份验证,您将获得一个身份验证代码,然后他们必须将这些代码带回您的应用程序。它也出现在浏览器标题中。
https://accounts.google.com/o/oauth2/auth?client_id={clientid}.apps.googleusercontent.com&redirect_uri=urn:ietf:wg:oauth:2.0:oob&scope=https://www.googleapis.com/auth/analytics.readonly&response_type=code
这里可以找到所有三个步骤的完整说明Google 3 legged oauth2
我不确定我理解你为什么这样做。使用Google .net客户端lib更容易。 NuGet Google Client lib我不确定您打算访问哪个API但使用nuget访问Google,您应该找到要安装的正确的lib。