Apache Amber ライブラリを使用して、自分の管理下にある Web サイトから 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 からの呼び出しが失敗するのはなぜですか?