Oauth 2 无法将代码交换为访问令牌,返回"invalid_grant"



我发现,当我的重定向uri为"urn:ietf:wg:OAuth:2.0:oob"时,我可以通过OAuth 2.0进行身份验证,但用户被迫复制代码,然后返回一个活动并将其粘贴到字段中。我希望体验比这更优雅。重定向uri为"http://localhost",(即使返回了访问代码)我无法将其兑换为api的访问令牌。这是我的兑换代码:

            ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(
                    0);
            nameValuePairs.add(new BasicNameValuePair("client_id",
                    OAuth2ClientCredentialsMark1.CLIENT_ID));
            nameValuePairs.add(new BasicNameValuePair("client_secret",
                    OAuth2ClientCredentialsMark1.CLIENT_SECRET));
            nameValuePairs.add(new BasicNameValuePair("code", accessCode));
            nameValuePairs.add(new BasicNameValuePair("grant_type",
                    "authorization_code"));
            nameValuePairs.add(new BasicNameValuePair("redirect_uri",
                    OAuth2ClientCredentialsMark1.REDIRECT_URI));
                    //"http://localhost"
            String url = "https://accounts.google.com/o/oauth2/token";
            //url += URLEncodedUtils.format(nameValuePairs, "utf-8");
            Log.d("print", url);
            HttpPost hPost = new HttpPost(
                    url);
            hPost.setHeader("content-type", "application/x-www-form-urlencoded");
            hPost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

此代码总是返回{"error":"invalid_grant"}给出了什么?

我的应用程序基于示例@https://github.com/ddewaele/LatitudeOAuth2Sample我一直在学习教程@http://code.google.com/apis/accounts/docs/OAuth2InstalledApp.html

您的代码似乎是正确的。错误来自OAuth2规范第5.2节。

提供的授权授予(例如,授权代码、资源所有者凭据)或刷新令牌无效、已过期、已吊销、与授权请求中使用的重定向URI不匹配,或者已颁发给另一个客户端。

很可能,您的应用程序尚未得到用户的授权


回答您的担忧:

用户被迫复制代码,然后返回一个活动并将其粘贴到字段中

你能澄清一下你正在开发什么样的oauth2流(场景)吗?

正如下面的线程所建议的,这可能是一个TIMING错误。确保您的服务器与世界时钟同步可能会完全防止invalid_grant错误。

我只有一台服务器出现了这个问题,事实上,这是唯一一台比世界时钟慢40秒的服务器(这是在未来)。我使用ntpdate强制更改日期,并安装了ntp服务。这是一个Linux盒子。

https://groups.google.com/forum/?fromgroups=#!主题/谷歌分析数据导出api/4uNaJtquxCs

{
  "access_token" : "ya29.AHES6ZTtm7SuokEB-RGtbBty9IIlNiP9-eNMMQKtXdMP3sfjL1Fc",
  "token_type" : "Bearer",
  "expires_in" : 3600,
  "refresh_token" : "1/HKSmLFXzqP0leUihZp2xUt3-5wkU7Gmu2Os_eBnzw74"
}

当您第一次尝试为应用程序获取accesstoken时,您会得到上面的内容。在您的访问令牌到期一小时后,您可以使用refresh_token获得新的访问令牌。。。。这是你的链接https://developers.google.com/youtube/2.0/developers_guide_protocol_oauth2#OAuth2_Refreshing_a_Token

相关内容

  • 没有找到相关文章

最新更新