我正在使用 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,缺少参数 access_token
现在,我可以打印出第一个请求返回的代码,并将其粘贴到从我的台式机运行的 curl 命令中:
curl -d "code=...&client_id=...&client_secret=...&grant_type=...&redirect_uri=..." http://my_website.com
我从我的网站获得了一个带有 access_token 的不错的 JSON 响应。
为什么来自 Java 的调用失败,而我的手动命令行成功了?