我发现当我的重定向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
答案 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
的链接