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