[Java, Security] OAuth with Jersey 2

原文はこちら。
https://blogs.oracle.com/mira/entry/oauth_support_in_jersey_2

Jersey 2.3でOAuthのサポートが追加されました。OAuthのサポートについては、サンプルつきで以下のドキュメントで説明があります。
Jersey 2.4.1 User Guide
Security > OAuth Support
https://jersey.java.net/documentation/latest/security.html#d0e9038
OAuth 1 をJersey 1.xから移行しました。OAuth 1用のサーバーAPIをあまり変更せず、利用方法の基本原則はJersey 1.xと同様にしています。APIでは認可フローとOAuth 1認可ヘッダー(OAuth1署名を含む)を使う認証をサポートします。アクセストークンやリクエストトークン、利用者の資格証明を管理するOAuth1Providerのご自身の実装を登録することができます。実装はトークン作成ならびにトークンの保存(例えばデータベースへ保存)の責務を負います。残りはJerseyがやってくれます。
クライアントAPIは、認可フロー(ユーザー認可プロセス)の実行方法が大きく変わりました。認可フローはもはやクライアントフィルタに含まれず、スタンドアロンのツールに分離されています。API変更の理由は、クライアントがWebアプリケーションである場合に認可フローを簡単に利用できるようにするためでした。以前のAPIでは、クライアントフィルタから例外を送出し、ユーザーコードがその例外を処理し、ユーザーをリダイレクトして再度リクエスト(認可フローを終了させるフィルタを再度呼び出すリクエスト)を呼び出す、ということによってのみユーザーのリダイレクトが可能でした。現在ではフィルタを使ってOAuth署名をAuthorizationヘッダーに追加するだけで、認可フローは完全に分離されています。このことにより、様々なユーザーが何度も一つのクライアントインスタンスを再利用して認可フローを実行することができます。さらに、認可フローのAPIは認可プロセス内で例外の送出、捕獲を必要としません。
OAuthサポートを使ってTwitterに接続するOAuth 1クライアントのサンプルをチェックしてください。
oauth-client-twitter
https://github.com/jersey/jersey/tree/master/examples/oauth-client-twitter
Jersey 2でのOAuth 2 のサポートは現在クライアント用のみ実装されています(このエントリ執筆時現在のバージョンは2.4.1)。The API for OAuth 2クライアントをサポートするAPIは、Jersey 2でのOAuth 1クライアントをサポートするものと類似しています。

OAuth 2 APIの使用例です。
Auth2CodeGrantFlow flow = OAuth2ClientSupport
                .authorizationCodeGrantFlowBuilder(clientId, authUri, accessTokenUri)
                .scope("contact")
                .build(); 
認可フローは OAuth2ClientSupport という静的メソッド(OAuth 2クライアントAPIへアクセスするためのメインクラス)を使って構築されています。クライアントアプリケーションの資格証明(clientId)と認可フロー時に使うURIをを渡す必要があります。これらのパラメータは全てサービスプロバイダが発行します。サービスプロバイダはユーザーの同意を得てアクセスしたい当事者です。
これで、 flow オブジェクトを使い、認可URIを生成して、認可フローを開始することができます。
String finalAuthorizationUri = flow.start();
finalAuthorizationUri とはユーザーをリダイレクトする先のURIです。これにはクエリパラメータが含まれており、その一つがclientIdです。ここで、ユーザーを認可URIにリダイレクトする必要があります。アプリケーションをサーバー上で利用する場合は、flow オブジェクトを(キャッシュに)格納し、ユーザーリクエストに対しHTTPのステータス303を返す必要があります。その際、認可URIを location ヘッダーに入れておく必要があります。ユーザーをサービスプロバイダにリダイレクトし、ユーザーにアプリケーションへ権限を付与するかどうかを尋ねるページを表示します。承認後、ユーザーをアプリケーションにリダイレクトします。code と state パラメータをリクエストから取り出し、これらを使って認可を終了します。
TokenResult result = flow.finish(code, state);
このメソッドは、内部でTokenResultに返されるサービスプロバイダからアクセストークンを要求し、その後最終的に、リクエスト内のAuthorizationヘッダーにあるこのトークンを使って、サービスプロバイダにクライアントアプリケーションを認証させることができます(JerseyはOAuth 2認可ヘッダを追加するフィルタを提供します)。
Jerseyには、OAuth 2のクライアントサポートを使用し、WebアプリケーションでGoogleアカウントからタスクを取得するという、OAuth 2サンプルが含まれています。
oauth2-client-google-webapp
https://github.com/jersey/jersey/tree/master/examples/oauth2-client-google-webapp
JerseyでOAuthサポートを試すには、Jerseyのドキュメントで手順を確認して下さい。
Jersey 2.4.1 User Guide
Security > OAuth Support
https://jersey.java.net/documentation/latest/security.html#d0e9038

0 件のコメント:

コメントを投稿