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に公開しています。

事前準備

JDK 8以上のインストールが必要です。

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

公式ページから、[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]をクリックします。

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

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

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

レルムの作成

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

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

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

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

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

ユーザーの設定

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

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

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

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

スコープの設定

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

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

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

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

クライアントの設定

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

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

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

[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 に設定します。

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

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

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

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

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ログインページ]にリダイレクトされます。

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

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

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

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

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

TODOの登録も出来ます。

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

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