Oauth 2无法用授权码交换访问令牌,返回“无效授权”错误。

4

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

我有同样的问题。除了使用Scala而不是Java之外,其他都一样。我使用http://localhost:9000作为重定向URI。 - Magnus
我在安装应用程序的OAuth上遇到了相同的问题。你解决了这个问题吗?请评论。 - Khushboo
3个回答

3

看起来你的代码是正确的。错误来自于OAuth2规范第5.2节

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

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


关于您的疑问:

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

您正在开发什么类型的oauth2流程(场景)


1

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接