Edited at

OAuth 2.0 with Spring Security 5.1の認可サーバーとしてKeycloakを使う


この記事について

JSUG Spring Fest 2018で、Spring Security 5.1によるOAuth 2.0の実装例を紹介します。

しかし、Spring Security 5.1にはクライアントとリソースサーバーの機能しかないため、認可サーバーにはKeycloakを使いました。

この記事では、今回のサンプルでの認可サーバーとしてKeycloakを使うためのインストールや設定方法を紹介します。

Keycloakのバージョンは4.5.0.Finalです。

クライアントとリソースサーバーはGitHubに公開しています。


ダウンロードとインストール

公式ページから、[Standalone server distribution]のZIPファイルをダウンロードします。そして、ローカルの適当なフォルダに展開するだけです。

Keycloak自体はアプリケーションなのですが、このZIPはWildFlyにデプロイされた状態になっていますので、単独で動作します。


起動

Keycloakを展開したフォルダ/bin の中の standalone.sh (Windowsの場合は standalone.bat )で起動します。

今回はポート番号9000で起動したいため、 -Djboss.http.port=9000 オプションを付加しています。

$ cd bin

$ ./standalone.sh -Djboss.http.port=9000


管理者名・パスワードの設定

Webブラウザで http://localhost:9000 を開き、画面左側の[Administration Console]に、管理者のユーザー名・パスワードを設定して[Create]をクリックします。

スクリーンショット 2018-10-21 12.13.57.png

成功すると[User Created]と表示されます。

スクリーンショット 2018-10-21 12.22.58.png

[Administration Console]の部分をクリックすると管理者ログイン画面が表示されます。

スクリーンショット 2018-10-21 12.24.35.png

設定したユーザー名・パスワードを入力して[Log In]をクリックします。


レルムの作成

画面左上の[Master]のあたりにマウスカーソルを合わせると出てくる[Add realm]をクリックします。

スクリーンショット 2018-10-21 12.26.39.png

[Name]に任意のレルム名(今回は todo-api )を入力して[Create]をクリックします。

スクリーンショット 2018-10-21 12.28.57.png

[Tokens]タブを選択して、[Access Token Lifespan]を[1 Minutes]に設定します。


これは、Keycloakが発行するアクセストークンの有効期間を設定しています。デフォルトは5分ですが、説明のため短めにしています。


スクリーンショット 2018-10-21 12.30.44.png

下の方にスクロールして[Save]をクリックします。

スクリーンショット 2018-10-21 12.34.53.png


ユーザーの設定

画面左側の[Users]をクリックし、画面右側の[Add user]をクリックします。

スクリーンショット 2018-10-21 13.02.09.png

[Username]に user と入力して [Save] をクリックします。

スクリーンショット 2018-10-21 13.04.39.png

[Credentials]タブを開き、[New Password]と[Password Confirmation]にパスワードを設定し、[Temporary]を[OFF]にして[Reset Password]をクリックします。

スクリーンショット 2018-10-21 13.06.52.png

ダイアログが出てきたら[Change Password]を選択してください。

スクリーンショット 2018-10-21 13.07.47.png


スコープの設定

画面左側の[Client Scopes]をクリックし、画面右側の[Create]をクリックします。

スクリーンショット 2018-10-21 13.08.56.png

[Client Scope Template]は[No template]にして[Next]をクリックします。

スクリーンショット 2018-10-21 13.09.22.png

[Name]に todo:read と入力して[Save]をクリックします。

スクリーンショット 2018-10-21 13.13.05.png

同様の手順で、 todo:write スコープも設定します。最終的には下記のような状態になります。

スクリーンショット 2018-10-21 13.14.53.png


クライアントの設定

画面左側の[Clients]をクリックし、画面右側の[Create]をクリックします。

スクリーンショット 2018-10-21 12.37.37.png

[Client ID]に todo-client と、[Root URL]に http://localhost:8080 と入力して[Save]をクリックします。


この値は、クライアントアプリケーションのapplication.ymlspring.security.oauth2.client.registration.todo.client-id に設定します。


スクリーンショット 2018-10-21 12.44.05.png

[Settings]タブを開き、[Access Type]を[confidential]、[Valid Redirect URIs]に http://localhost:8080/login/oauth2/code/todo-client と入力して、[Save]をクリックします。


この値は、クライアントアプリケーションのapplication.ymlspring.security.oauth2.client.registration.todo.redirect-uri に設定します。


スクリーンショット 2018-10-21 12.48.16.png

スクリーンショット 2018-10-21 12.48.37.png

[Credentials]タブを開き、[Secret]の値をコピーします。


この値は、クライアントアプリケーションのapplication.ymlspring.security.oauth2.client.registration.todo.client-secret に設定します。


スクリーンショット 2018-10-21 12.51.57.png

[Client Scopes]タブを開き、[Default Client Scopes]で todo:readtodo:write を選択して[Add selected]をクリックします。2つのスコープが[Assigned Default Client Scopes]に移動すれば成功です。

スクリーンショット 2018-10-21 13.17.37.png


クライアントとリソースサーバーを起動してテスト

GitHubからソースコードをクローンします。

$ git clone https://github.com/MasatoshiTada/oauth2-with-spring-security-51.git

clientフォルダに移動して、クライアントを起動します。

$ cd oauth2-with-spring-security-51/client

$ mvn clean package
$ java -jar target/client-0.0.1-SNAPSHOT.jar

別のターミナル(Windowsの場合はコマンドプロンプト)を開いて、リソースサーバーを起動します。

$ cd oauth2-with-spring-security-51/resource-server

$ mvn clean package
$ java -jar target/resource-server-0.0.1-SNAPSHOT.jar

Webブラウザで http://localhost:8080/ にアクセスします。そうすると、[OAuth2ログインページ]にリダイレクトされます。

スクリーンショット 2018-10-21 13.26.10.png

[Keycloakでログイン]をクリックすると、Keycloakのログイン画面にリダイレクトされるので、Keycloakに設定したユーザーでログインします。

スクリーンショット 2018-10-21 13.27.47.png

すると、クライアントに再リダイレクトされ、TODO一覧が表示されます。

スクリーンショット 2018-10-21 13.28.11.png

Keycloak管理画面で画面左側の[Users]をクリックし、[View all users]をクリックしてuserの[ID]をクリックします。

スクリーンショット 2018-10-21 13.31.58.png

[Sessions]タブをクリックすると、現在Keycloakにログイン中のセッションが表示されます。


各セッションの[Logout]をクリックすると、そのセッションを強制破棄することができます。


スクリーンショット 2018-10-21 13.33.04.png

スクリーンショット 2018-10-21 13.33.58.png

TODOの登録も出来ます。

スクリーンショット 2018-10-21 13.29.23.png

スクリーンショット 2018-10-21 13.29.56.png

[ログアウト]をクリックするとクライアントとKeycloakの両方からログアウトします。

スクリーンショット 2018-10-21 13.35.31.png

スクリーンショット 2018-10-21 13.35.52.png


Keycloakからもログアウトする方法はこちらの記事参照。ソースコードはこのへんです。