🚶‍♂️

Keycloak New Security Admin Console 開発の一歩

2023/02/05に公開1

Keycloakは現在、セキュリティ管理コンソールを新しいコンソールに切り替えを行おうとしています。
Keycloak v21.0では旧のセキュリティ管理コンソールは削除される予定です。
今回は年末年始にKeycloakの新しいセキュリティ管理コンソールの改修を行ったので、その過程を記載しようと思います。

きっかけ

https://github.com/keycloak/keycloak/discussions/14021

GitHubでこちらのDiscussionを見かけました。
確かにこの設定は新しいセキュリティ管理コンソールにありませんでした。
無いなら追加してみようと思いましたが、New Admin Consoleについてはどうやって改修すればいいの?みたいになったので、色々と調べながら修正を行っていきました。

Keycloak GitHub リポジトリ

まずKeycloakの新しいUIについてですが、リポジトリは keycloak-ui で管理されています。
https://github.com/keycloak/keycloak-ui
Keycloakにはおおきくわけると2つのUIがあり、このリポジトリで管理されています。

  • Account UI
    • アカウントコンソール(一般利用者向け)
  • Admin UI
    • セキュリティ管理コンソール(管理者向け)

今回はIdentity Brokerという他のOpenID Providerに認証を向ける管理者向けの設定の部分なので、後者の方の対応となります。
https://github.com/keycloak/keycloak-ui/issues/4144

このリポジトリをForkし、git cloneでコードをローカルPCに取得します。

git clone https://github.com/i7a7467/keycloak-ui.git
cd keycloak-ui

keycloak-ui の開発環境準備

開発環境の準備についてはこちらに記載されています。

こちらの準備を実施すると、このような環境が出来上がります。
開発環境構成

UIの開発の確認は左のサーバーにアクセスして確認していくことになります。

必要なもの

開発環境Keycloak-serverの起動

まずはkeycloak-serverから起動します。

起動方法についてはこちらに記載されています。

kcuser@example keycloak-ui % cd apps/keycloak-server 
kcuser@example keycloak-server % npm run start

> start
> ./scripts/start-server.mjs

Downloading and extracting server…
(node:4057) ExperimentalWarning: The Fetch API is an experimental feature. This feature could change at any time
(Use `node --trace-warnings ...` to show where the warning was created)
Starting server…
Updating the configuration and installing your custom providers, if any. Please wait.
2023-02-02 23:47:36,734 INFO  [org.keycloak.common.Profile] (build-106) Preview features enabled: admin-fine-grained-authz, declarative-user-profile
2023-02-02 23:47:42,823 INFO  [io.quarkus.deployment.QuarkusAugmentor] (main) Quarkus augmentation completed in 7693ms
...

今回はAdmin UIの開発なので起動させたkeycloak-serverに開発用Admin UIがアクセスできるようにクライアントの登録を行う必要があります。

cd keycloak-ui/apps/keycloak-server/scripts
npm run import-client

> import-client
> wireit

✅ [../../libs/keycloak-admin-client:build] Restored from cache
🏃 [import-client] Running command "./scripts/import-client.mjs"
(node:4697) ExperimentalWarning: The Fetch API is an experimental feature. This feature could change at any time
(Use `node --trace-warnings ...` to show where the warning was created)
Importing client…
Client imported successfully.
✅ [import-client] Executed successfully

上述のコマンドを実行することで以下のようにKeycloak serverに security-admin-console-v2 のクライアントが登録されます。Home URLが http://localhost:8080になっています。
Keycloak-serverのポートでも、セキュリティ管理コンソールにはアクセスできますので、以下のように確認可能です。

開発環境keycloak-uiの起動

続いて、コード修正しながらセキュリティ管理コンソールを確認できるようにkeycloak-uiを起動します。

kcuser@example keycloak-ui % cd apps/admin-ui 
kcuser@example admin-ui % npm run dev          

> dev
> wireit

✅ [../../libs/keycloak-admin-client:build] Already fresh
✅ [../../libs/keycloak-js:build] Restored from cache
🏃 [dev] Running command "vite --host"

  VITE v3.2.5  ready in 1489 ms

  ➜  Local:   http://localhost:8080/
  ➜  Network: http://192.168.3.2:8080/

http://localhost:8080 で開発者用のセキュリティ管理コンソールにアクセスできます。

あくまでkeycloak-serverのクライアントとして登録されているので、ログインするときはKeycloak-serverのログイン画面(8180ポート)になります。

これで開発環境の準備は整いました。次に修正する内容のissueを起票しましょう。
続いてコードの修正をします。

セキュリティ管理コンソールの改修

keycloak-uiは React と PatternFly4 で書かれています。
赤帽エンジニアブログにPatternFly4について書かれている記事があります。
今回はこちらのブログとPatternFly4の公式サイトを参考にして、コードの修正を行いました。

開発環境ではViteが使われており、ホットリロードが行われ、修正した内容をすぐ確認できるようになっています。コーディング規約はこちらです。

e2eテストの実装

keycloak-uiのリポジトリではe2eテストとして、cypressが使われています。
cypressによるテストコードの書き方についてもこちらで記載されています。
以下のコマンドを実行するとcypressのテストを実行することができます。

kcuser@example keycloak-ui % cd apps/admin-ui 
kcuser@example admin-ui % npm run cy:open

> cy:open
> cypress open --e2e --browser chrome

Still waiting to connect to Chrome, retrying in 1 second (attempt 18/62)
Still waiting to connect to Chrome, retrying in 1 second (attempt 19/62)
GET /chrome-variations/seed?osname=mac&channel=stable&milestone=109 200 938.554 ms - -

cypressのコンソールが起動するので、テスト対象のファイルを選択するとテストを実行できます。

PRの作成

PRを作成し、レビューを受けます。

https://github.com/keycloak/keycloak-ui/pull/4145

さいごに

keycloakの新セキュリティ管理コンソールは利用していると、前と異なる点がいくつかあり、他にも数点気づいた内容についてはPRを上げました。
https://github.com/keycloak/keycloak-ui/issues/4111
https://github.com/keycloak/keycloak-ui/issues/4251

旧セキュリティ管理コンソールもv21.0で廃止予定ですので、新セキュリティ管理コンソールで気づいた点があれば、修正のPRを出してみてはいかがでしょうか。

Discussion

九

keycloak-serverのh2 dbにアクセスする方法

keycloak-uiから設定した値がDBに格納されているかどうか確認したい場合があると思います。
その場合はこちらの方法でコンソールを起動し、h2 dbのデータを確認してみてください。

java -cp ./apps/keycloak-server/server/lib/lib/main/com.h2database.h2-2.1.214.jar org.h2.tools.Console
  • JDBC URL
    jdbc:h2:file:./apps/keycloak-server/server/data/h2/keycloakdb;AUTO_SERVER=TRUE
  • ユーザ名
    sa
  • パスワード
    password