LoginSignup
3
3

More than 5 years have passed since last update.

Jersey OAuth 2クライアントで遊ぶ

Last updated at Posted at 2016-12-17

これはJava EE Advent Calendar 2016の17日目です。

概要

JAX-RSの参照実装であるJerseyにはOAuth 2のクライアントをサポートする拡張があります。
今回はそれを使ったサンプルを作ってみました。
ちなみに、認証サーバはSpringで作ってみました。

サンプルコードはGitHubに公開しています。

サンプルの説明

アプリケーション自体は"Hello, <ユーザ名>!"を表示するだけの簡単なものです。
このユーザ名に当たる部分を、認証サーバで認証したユーザの名前を取得して表示します。
ユーザ情報の取得に対する許可をOAuth 2で与えています。

まず http://localhost:8080/helloworld を開こうとします。

open-helloworld.png

すると、認証サーバへリダイレクトされ、ログインを促されます。

authentication.png

ログインすると、今度はhelloworldアプリケーションに対してユーザ情報の取得に対する許可を与えるか確認されます。

oauth-approval.png

許可を与えると、helloworldアプリケーションに戻ってきて挨拶が表示されます。

helloworld.png

コードの説明

セッションにアクセストークンが保存されていない場合、helloworldアプリケーションが認可されていないと判断して、アクセストークンを取得するための認可コードを取得するため、OAuth2CodeGrantFlowstartメソッドを使用してリダイレクトURIを構築しています

OAuth2CodeGrantFlow flow = OAuth2ClientSupport.authorizationCodeGrantFlowBuilder(
        clientIdentifier, authorizationUri, accessTokenUri)
        .redirectUri(redirectUri)
        .client(client)
        .property(Phase.ALL, OAuth2Parameters.STATE, state.getValue())
        .build();
URI location = URI.create(flow.start());

認可が済むと、上記のredirectUriメソッドで設定したURIにリダイレクトされますが、このとき認可コードがcodeという名前でクエリパラメータとして付いてきます。
リクエストURIをパーズしてcodeを得たら、OAuth2CodeGrantFlowfinishメソッドに渡してアクセストークンを取得します

OAuth2CodeGrantFlow flow = OAuth2ClientSupport.authorizationCodeGrantFlowBuilder(
        clientIdentifier, authorizationUri, accessTokenUri)
        .redirectUri(redirectUri)
        .client(client)
        .property(Phase.ALL, OAuth2Parameters.STATE, state.getValue())
        .build();
String state = queryParameters.getFirst("state");
TokenResult tokenResult = flow.finish(code, state);

ユーザー情報を取得する際は、アクセストークンをAuthorizationヘッダに埋め込みますが、これを勝手にやってくれるFeatureを生成するのがOAuth2ClientSupportfeatureメソッドです
このFeatureClientに登録しておきます。

public Client client() {
    return ClientBuilder.newBuilder()
            .register(HttpAuthenticationFeature.basic(clientId, clientSecret))
            .register(OAuth2ClientSupport.feature(accessToken.getValue()))
            .build();
}

まとめ

Jerseyのoauth2-clientを使えば、OAuth 2を利用したクライアントアプリケーションを作ることができました。
とはいえ、サンプルコードを見てもらうと分かるように、それなりに作りこむ必要がありました(私のoauth2-client習熟不足かもしれませんが)。
さらに、とりあえず動く形にしてみたぐらいなので、実装する上でもっと考慮しないといけないことはあると思います。

このように、もうちょい簡単に作れたらいいのになー、と贅沢な不満はありますが、動くサンプルは作れたので満足しました。

以上⛄️

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3