この記事について
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.ymlで
spring.security.oauth2.client.registration.todo.client-id
に設定します。
[Settings]タブを開き、[Access Type]を[confidential]、[Valid Redirect URIs]に http://localhost:8080/login/oauth2/code/todo-client
と入力して、[Save]をクリックします。
この値は、クライアントアプリケーションのapplication.ymlで
spring.security.oauth2.client.registration.todo.redirect-uri
に設定します。
[Credentials]タブを開き、[Secret]の値をコピーします。
この値は、クライアントアプリケーションのapplication.ymlで
spring.security.oauth2.client.registration.todo.client-secret
に設定します。
[Client Scopes]タブを開き、[Default Client Scopes]で todo:read
と todo: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の両方からログアウトします。