Oauth 2无法交换访问令牌的代码,返回“invalid_grant”

时间:2012-02-17 22:44:44

标签: android google-api oauth-2.0

我发现当我的重定向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));

此代码始终返回{&#34;错误&#34; :&#34; invalid_grant&#34;}是什么给出了?

我的应用基于样本@ https://github.com/ddewaele/LatitudeOAuth2Sample而且我一直在关注教程@ http://code.google.com/apis/accounts/docs/OAuth2InstalledApp.html

3 个答案:

答案 0 :(得分:3)

您的代码似乎是正确的。错误来自OAuth2 spec section-5.2

  

提供的授权许可(例如授权代码,资源所有者凭据)或刷新令牌无效,已过期,已撤销,与授权请求中使用的重定向URI不匹配,或已发布给其他客户端。

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


回答您关注的问题:

  

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

你能说清楚你正在开发什么样的oauth2 flow (scenario)吗?

答案 1 :(得分:1)

如以下主题所示,它可能是TIMING错误。确保您的服务器与世界时钟同步可能只会完全阻止invalid_grant错误。

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

https://groups.google.com/forum/?fromgroups=#!topic/google-analytics-data-export-api/4uNaJtquxCs

答案 2 :(得分:0)

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

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

的链接