Keycloak Admin Client の使用
Quarkus Keycloak Admin Client およびそのリアクティブ版は、実行中の Keycloak サーバーを設定するために使用できる Keycloak Admin Client をサポートしています。
このガイドでは、 Quarkus ArC を活用して、管理クライアントを Quarkus アプリケーションに注入する方法と、アプリケーションコードで直接作成する方法について説明します。
Keycloak Admin Client の詳細については、 リファレンスガイド を参照してください。
前提条件
このガイドを完成させるには、以下が必要です:
-
約15分
-
IDE
-
JDK 17+がインストールされ、
JAVA_HOMEが適切に設定されていること -
Apache Maven 3.9.12
-
動作するコンテナランタイム(Docker, Podman)
-
使用したい場合は、 Quarkus CLI
-
ネイティブ実行可能ファイルをビルドしたい場合、MandrelまたはGraalVM(あるいはネイティブなコンテナビルドを使用する場合はDocker)をインストールし、 適切に設定していること
プロジェクトの作成
まず、新しいプロジェクトが必要です。次のコマンドで新規プロジェクトを作成します:
Windowsユーザーの場合:
-
cmdを使用する場合、(バックスラッシュ
\を使用せず、すべてを同じ行に書かないでください)。 -
Powershellを使用する場合は、
-Dパラメータを二重引用符で囲んでください。例:"-DprojectArtifactId=security-keycloak-admin-client"
このコマンドは、 keycloak-admin-rest-client エクステンションと rest-jackson エクステンションをインポートするプロジェクトを生成します。
Quarkus プロジェクトがすでに設定されている場合は、プロジェクトのベースディレクトリで次のコマンドを実行して、 keycloak-admin-rest-client エクステンションと rest-jackson エクステンションをプロジェクトに追加できます。
quarkus extension add keycloak-admin-rest-client,rest-jackson
./mvnw quarkus:add-extension -Dextensions='keycloak-admin-rest-client,rest-jackson'
./gradlew addExtension --extensions='keycloak-admin-rest-client,rest-jackson'
これにより、ビルドファイルに以下が追加されます:
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-keycloak-admin-rest-client</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-rest-jackson</artifactId>
</dependency>
implementation("io.quarkus:quarkus-keycloak-admin-rest-client")
implementation("io.quarkus:quarkus-rest-jackson")
また、リクエストスコープの CDI Bean として Keycloak が注入されたシンプルなリソースも必要になります。
package org.acme.keycloak.admin.client;
import org.keycloak.admin.client.Keycloak;
import org.keycloak.representations.idm.RoleRepresentation;
import jakarta.inject.Inject;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import java.util.List;
@Path("/api/admin")
public class RolesResource {
@Inject
Keycloak keycloak; (1)
@GET
@Path("/roles")
public List<RoleRepresentation> getRoles() {
return keycloak.realm("quarkus").roles().list();
}
}
| 1 | 新しいレルム、クライアント、ユーザーの追加など、 admin-cli クライアントとして Keycloak の master レルム管理タスクを実行できる、デフォルトの Keycloak Admin Client を作成します。 |
この Keycloak Admin Client を作成するために必要な唯一の設定は、Keycloak サーバーの URL です。
次に例を示します:
# Quarkus based Keycloak distribution
quarkus.keycloak.admin-client.server-url=http://localhost:8081
または
# WildFly based Keycloak distribution
quarkus.keycloak.admin-client.server-url=http://localhost:8081/auth
|
|
アプリケーションコードで直接作成する代わりに Keycloak Admin Client を注入する方が、よりシンプルで柔軟なオプションですが、必要であれば同じ管理クライアントを手動で作成することもできます。
package org.acme.keycloak.admin.client;
import org.keycloak.admin.client.Keycloak;
import org.keycloak.admin.client.KeycloakBuilder;
import org.keycloak.representations.idm.RoleRepresentation;
import jakarta.annotation.PostConstruct;
import jakarta.annotation.PreDestroy;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import java.util.List;
@Path("/api/admin")
public class RolesResource {
Keycloak keycloak;
@PostConstruct
public void initKeycloak() {
keycloak = KeycloakBuilder.builder()
.serverUrl("http://localhost:8081")
.realm("master")
.clientId("admin-cli")
.grantType("password")
.username("admin")
.password("admin")
.build();
}
@PreDestroy
public void closeKeycloak() {
keycloak.close();
}
@GET
@Path("/roles")
public List<RoleRepresentation> getRoles() {
return keycloak.realm("quarkus").roles().list();
}
}
詳細については、 Keycloak Admin REST API ドキュメント を参照してください。
Keycloak Admin Client は、他のレルムやクライアントを管理するように設定できます。認可が必要な Admin REST API を呼び出すためにアクセストークンを取得するには、 password または client_credentials グラントのいずれかを使用できます。
ユーザーのクレデンシャルをアクセストークンと交換する場合、 password グラントタイプの設定例を次に示します:
quarkus.keycloak.admin-client.server-url=http://localhost:8081
quarkus.keycloak.admin-client.realm=quarkus
quarkus.keycloak.admin-client.client-id=quarkus-client
quarkus.keycloak.admin-client.username=alice
quarkus.keycloak.admin-client.password=alice
quarkus.keycloak.admin-client.grant-type=PASSWORD (1)
| 1 | password グラントタイプを使用します。 |
client-credentials グラントタイプを使用する例では、わずかな調整のみが必要です:
quarkus.keycloak.admin-client.enabled=true
quarkus.keycloak.admin-client.server-url=http://localhost:8081
quarkus.keycloak.admin-client.realm=quarkus
quarkus.keycloak.admin-client.client-id=quarkus-client
quarkus.keycloak.admin-client.client-secret=secret
quarkus.keycloak.admin-client.username= # remove default username
quarkus.keycloak.admin-client.password= # remove default password
quarkus.keycloak.admin-client.grant-type=CLIENT_CREDENTIALS (1)
| 1 | client_credentials グラントタイプを使用します。 |
| なお、 OidcClient もトークンの取得に使用できます。 |
TLS の設定
Keycloak Admin Client の TLS 接続を設定するには、TLS Registry エクステンションを使用し、Keycloak Admin Client をそれぞれの TLS 設定にポイントします。たとえば、相互 TLS (mTLS) は次のように設定できます:
quarkus.keycloak.admin-client.tls-configuration-name=kc-mtls
quarkus.tls.kc-mtls.key-store.p12.path=client-keystore.p12
quarkus.tls.kc-mtls.key-store.p12.password=secret
quarkus.tls.kc-mtls.trust-store.p12.path=client-truststore.p12
quarkus.tls.kc-mtls.trust-store.p12.password=secret
テスト
Keycloak Admin Client を Keycloak に対してテストする推奨されるアプローチは、 Dev Services for Keycloak です。 Dev Services for Keycloak はテストコンテナーを起動して初期化します。その後、 quarkus レルムと quarkus-app クライアント (secret シークレット) を作成し、 alice (admin と user ロール) および bob (user ロール) ユーザーを追加します。これらのすべての設定プロパティーはカスタマイズ可能です。
たとえば、デフォルトでは、テストコンテナーはランダムに割り当てられたポートで利用可能ですが、Keycloak Admin Client とコンテナーの両方に同じポートを使用させるには、次のようにします:
%test.quarkus.keycloak.devservices.port=${kc.admin.port.test:45180} (1)
%test.quarkus.keycloak.admin-client.server-url=http://localhost:${kc.admin.port.test:45180}/ (2)
| 1 | Keycloak コンテナーがデフォルトで 45180 ポートをリッスンするように設定します |
| 2 | Keycloak Admin Client が同じポートを使用するように設定します |
Quarkus Keycloak Admin Client 設定リファレンス
ビルド時に固定される設定プロパティー - 他のすべての設定プロパティーは実行時にオーバーライド可能です
Configuration property |
型 |
デフォルト |
|---|---|---|
Set to true if Keycloak Admin Client injection is supported. Environment variable: Show more |
boolean |
|
Keycloak server URL, for example, Environment variable: Show more |
string |
|
Realm. Environment variable: Show more |
string |
|
Client id. Environment variable: Show more |
string |
|
Client secret. Required with a Environment variable: Show more |
string |
|
Username. Required with a Environment variable: Show more |
string |
|
Password. Required with a Environment variable: Show more |
string |
|
OAuth 2.0 Access Token Scope. Environment variable: Show more |
string |
|
OAuth Grant Type. Environment variable: Show more |
|
|
The name of the TLS configuration to use. If a name is configured, it uses the configuration from The default TLS configuration is not used by default. Environment variable: Show more |
string |