Google Oauth 2从授权代码获取访问令牌和刷新令牌

时间:2014-12-28 10:11:31

标签: javascript c# oauth oauth-2.0 google-oauth

我在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问题)。我尝试了添加日志,没有例外,也没有进一步执行。

1 个答案:

答案 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。