Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

この記事について

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からもログアウトする方法はこちらの記事参照。ソースコードはこのへんです。

suke_masa
Java / Spring / Microservices / Kubernetes(CKAD) / IntelliJ IDEA
https://www.casareal.co.jp/ls
casareal
システム開発/評価・検証支援/品質改善支援サービスと現場に即した実践的なIT研修サービスを提供しています。
https://www.casareal.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away