3

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 からの呼び出しが失敗するのはなぜですか?

4

4 に答える 4

3

クライアントとサーバーの実装で同じ問題がありました。問題は、Apache Amber (Oltu) プロジェクトのクライアントの例の 1 つの間違いです。

まず、Auth コード リクエストを取得します (これは機能します)。

OAuthClientRequest request = OAuthClientRequest
    .authorizationLocation(AUTHORIZE_URL)
    .setClientId(CLIENT_ID)
    .setRedirectURI(REDIR_URL)
    .setResponseType(CODE_RESPONSE)
    .**buildQueryMessage**();

そして2番目のアクセストークンに関するリクエスト(これは機能しません):

OAuthClientRequest request = OAuthClientRequest
    .tokenLocation(ACCESS_TOKEN_URL)
    .setGrantType(GrantType.AUTHORIZATION_CODE)
    .setClientId(CLIENT_ID)
    .setClientSecret(CLIENT_SECRET)
    .setRedirectURI(REDIR_URL)
    .setCode(code)
    .**buildBodyMessage**();

間違いはbuildBodyMessage()2 番目のリクエストの に関するものです。で変更しbuildQueryMessage()ます。

于 2013-08-21T16:42:16.550 に答える
0

これは私が遭遇したものであり、それを機能させるために私がしたことです:

https://cwiki.apache.org/confluence/display/OLTU/OAuth+2.0+Client+Quickstart および svn.apache.org/repos/asf/oltu/trunk/oauthで説明されている同様の例を 簡単にまとめました。 -2.0/client/src/test/java/org/apache/oltu/oauth2/client/OAuthClientTest.java

これはそれを実行するための私のコマンドでした:

java -cp .:./org.apache.oltu.oauth2.client-1.0.1-20150221.171248-36.jar OAuthClientTest

また、access_tokenが予期されていた上記のエラーが発生しました。私は最終的に intellij でデバッグし、文字列が "{" 文字で始まることを確認する if 条件で異常を追跡しました。

その際、トレースをもう少し深くデバッグできるように、次の jar もクラスパスに追加しました。./java-json.jar ( http://www.java2s.com/Code/Jar/j/Downloadjavajsonjar.htmからダウンロード)

次のデバッグ セッション中に、コードが実際に機能し始めました。私の仲間と私は最終的に、JSON jar が含まれていないことが根本的な原因であることを発見しました。

これは機能するコマンドです:

java -cp .:./java-json.jar:./org.apache.oltu.oauth2.client-1.0.1-20150221.171248-36.jar OAuthClientTest
于 2015-04-14T06:21:32.023 に答える