【发布时间】:2012-08-29 14:52:14
【问题描述】:
我正在使用 Apache Amber 库尝试从我控制的网站检索 OAuth2 访问令牌。我的客户端代码在 Android 下运行。
我的代码是在以下示例中设计的:
https://cwiki.apache.org/confluence/display/AMBER/OAuth+2.0+Client+Quickstart
在第一步中,我可以通过使用 WebView 浏览器提交 GET 请求来检索“代码”:
OAuthClientRequest request = OAuthClientRequest
.authorizationLocation(AUTHORIZE_URL)
.setClientId(CLIENT_ID)
.setRedirectURI(REDIR_URL)
.setResponseType(CODE_RESPONSE)
.buildQueryMessage();
webview.loadUrl(request.getLocationUri());
我使用 WebViewClient 回调来捕获带有“code”参数的重定向 URL。到目前为止,一切顺利。
使用该代码,我尝试检索我的访问令牌:
OAuthClient oAuthClient = new OAuthClient(new URLConnectionClient());
OAuthClientRequest request = OAuthClientRequest
.tokenLocation(ACCESS_TOKEN_URL)
.setGrantType(GrantType.AUTHORIZATION_CODE)
.setClientId(CLIENT_ID)
.setClientSecret(CLIENT_SECRET)
.setRedirectURI(REDIR_URL)
.setCode(code)
.buildBodyMessage();
GitHubTokenResponse oAuthResponse =
oAuthClient.accessToken(request, GitHubTokenResponse.class);
每次我运行我的代码时,我都会收到 OAuthProblemException,其中消息是由于缺少参数 access_token,我有一个无效的请求。
另一个 StackOverflow 帖子提到了来自类似 OAuth2 请求的此异常,在这种情况下,这是由于 OAuth 请求之间的重定向 URI 不同造成的。但是我通过使用命名常量来确保我的重定向 URI 是相同的。这是该帖子的链接:
OAuthProblem, missing parameter access_token
现在,我可以打印出第一个请求返回的代码,并将其粘贴到从我的台式机运行的 curl 命令中:
curl -d "code=...&client_id=...&client_secret=...&grant_type=...&redirect_uri=..." http://my_website.com
我从我的网站收到了带有 access_token 的漂亮 JSON 响应。
为什么来自 Java 的调用失败,而我的手动命令行却成功了?
【问题讨论】:
-
更多信息:如果我在 Android 中滚动我自己的 HTTP POST 请求,我也会得到一个不错的 JSON 响应。我知道 Amber 库尚未正式发布,但这似乎是一个错误。我使用的是 0.31 版本。
-
您确定要将
GitHubTokenResponse而不是OAuthJSONAccessTokenResponse用于不是GitHub 的通用网站吗? -
没关系,只要我能把访问令牌转成字符串就行。事实上,我尝试使用 ...JSON... 方法,我的应用程序崩溃了。
-
使用 .buildQueryMessage();
-
@Paul Steckler - 快速入门页面现已删除。任何备用网址?