Keycloakのアップグレード
このガイドでは、Keycloakをアップグレードする方法について説明します。次の手順をこの順序で使用してください。
-
以前のバージョンのKeycloakからの移行の変更を確認します。
-
Keycloakサーバーをアップグレードします。
-
Keycloakアダプターをアップグレードします。
-
Keycloakクライアントライブラリ(Adminクライアント、Authorizationクライアント、Policy enforcer)をアップグレードします。これらはKeycloakサーバーとは独立してリリースされ、クライアントライブラリの最新リリースバージョンはKeycloakサーバーの最新リリースバージョンと互換性があるはずなので、通常はKeycloakサーバーとは独立して更新できます。詳細については、Keycloakクライアントライブラリのアップグレードを参照してください。
移行の変更
26.2.0への移行
互換性を損なう変更
互換性を損なう変更とは、既存のユーザーが構成を変更する必要がある変更として識別されます。
X-Forwarded-Host
ヘッダーを使用したポートの動作の変更
X-Forwarded-Host
ヘッダーには、オプションでポートを含めることもできます。以前のバージョンでは、ヘッダーからポートが省略されている場合、Keycloakは実際のリクエストポートにフォールバックしていました。たとえば、Keycloakがポート8080でリッスンしていて、リクエストにX-Forwarded-Host: example.com
ヘッダーが含まれている場合、解決されたURLはhttp://example.com:8080
でした。
これは変更され、ポートを省略すると、解決されたURLからポートが削除されるようになりました。前の例から解決されたURLは、http://example.com
になります。
それを軽減するには、リバースプロキシにX-Forwarded-Host
ヘッダーにポートを含めるか、目的のポートでX-Forwarded-Port
ヘッダーを設定するように構成します。
Oracle JDBCドライバーのインストールに関する変更
ディストリビューションに明示的に追加する必要があるOracle JDBCドライバーに必要なJARが変更されました。 ojdbc11
JARを提供する代わりに、Oracleデータベースドライバーのインストールガイドに記載されているように、ojdbc17
JARを使用してください。
最新のOIDC仕様に準拠したJWTクライアント認証
OpenID Connectコア仕様の最新ドラフトバージョンでは、クライアント認証メソッドprivate_key_jwt
およびclient_secret_jwt
のJWTクライアントアサーションのオーディエンス検証のルールが変更されました。
以前は、JWTクライアントアサーションのaud
クレームは、オーディエンスは、認証サーバーのトークンエンドポイントのURLである必要があります(SHOULD)
と緩く定義されており、他のURLの使用を除外していませんでした。
改訂されたOIDCコア仕様では、より厳密なオーディエンスチェックを使用しています。オーディエンスの値は、文字列として渡されるOPの発行者識別子である必要があり(MUST)、単一要素の配列であってはなりません(MUST NOT)。
private_key_jwt
とclient_secret_jwt
の両方のJWTクライアント認証オーセンティケーターを調整して、デフォルトでトークン内の単一のオーディエンスのみを許可するようにしました。今のところ、オーディエンスは、発行者、トークンエンドポイント、イントロスペクションエンドポイント、またはクライアントJWT認証で使用される他のOAuth/OIDCエンドポイントにすることができます。ただし、単一のオーディエンスのみが許可されるようになったため、JWTトークンがクライアント認証に対してKeycloakによってのみ本当に役立つようにするために、他の無関係なオーディエンス値を使用することはできなくなります。
この厳密なオーディエンスチェックは、OIDCログインプロトコルSPIの新しいオプションを使用して、以前のより寛大なチェックに戻すことができます。サーバーが次のオプションで起動された場合、JWTで複数のオーディエンスを使用することも引き続き許可されます。
--spi-login-protocol-openid-connect-allow-multiple-audiences-for-jwt-client-authentication=true
このオプションは将来削除される可能性があることに注意してください。おそらくKeycloak 27で。したがって、このオプションを使用する代わりに、クライアントを更新して単一のオーディエンスを使用することを強くお勧めします。クライアント認証にJWTを送信するときに、クライアントがオーディエンスに発行者URLを使用することも推奨されます。これは、将来のバージョンのOIDC仕様と互換性があるためです。
注目すべき変更
一般的な構成ミスを防ぎ、バグを修正し、Keycloakの実行を簡素化するために内部動作が変更された注目すべき変更。
組み込みのX509クライアント証明書ルックアッププロバイダーに適用されるproxy-trusted-addresses
組み込みのX.509クライアント証明書ルックアッププロバイダーは、proxy-trusted-addresses
構成オプションを反映するようになりました。 HTTPヘッダーを介して提供される証明書は、プロキシが信頼されている場合、またはproxy-trusted-addresses
が設定されていない場合にのみ処理されるようになりました。
ゼロ構成セキュアクラスタ通信
複数のノードをクラスタリングするために、Keycloakは分散キャッシュを使用します。このリリース以降、すべてのTCPベースのトランスポートスタックで、ノード間の通信はTLSで暗号化され、自動的に生成されたエフェメラルキーと証明書で保護されます。
TCPベースのトランスポートスタックを使用していない場合は、構成の簡素化とセキュリティの強化のメリットを享受するために、jdbc-ping
トランスポートスタックに移行することをお勧めします。
以前のリリースでTCPトランスポートスタック通信を保護するために独自のキーストアとトラストストアを提供していた場合は、セットアップの簡素化のメリットを享受するために、自動生成されたエフェメラルキーと証明書に移行することをお勧めします。
カスタムトランスポートスタックを使用している場合、このデフォルトの動作は、オプションcache-embedded-mtls-enabled
をfalse
に設定することで無効にできます。
詳細については、分散キャッシュガイドのトランスポートスタックの保護を確認してください。
Operatorがトラフィックを制限するためにNetworkPolicyを作成する
Keycloak Operatorは、デフォルトでKeycloakの分散キャッシュに使用される内部ポートへのトラフィックを制限するNetworkPolicyを作成するようになりました。
これにより、デフォルトで安全なセットアップが強化され、新しいセットアップの構成手順が最小限に抑えられます。既存のデプロイメントとの下位互換性があることを期待しているため、アップグレード時に追加の手順は必要ありません。 Keycloak CRでNetworkPolicyの作成を無効にすることで、以前の動作に戻すことができます。
デプロイメントスクリプトがKeycloakの明示的なNetworkPolicyを追加する場合は、それらを削除し、アップグレードのフォローアップとしてKeycloak CRで提供される新しい機能に移行することを検討する必要があります。
詳細については、Operatorの詳細構成をお読みください。
サポートされている標準トークン交換
このリリースでは、Keycloakは標準トークン交換(機能token-exchange-standard:v2
)のサポートを追加しました。過去のKeycloakリリースでは、Keycloakにはプレビュートークン交換機能しかありませんでした。これは現在、レガシートークン交換(機能token-exchange:v1
)と呼ばれています。レガシートークン交換はまだプレビュー段階であり、以前のリリースと同じように機能します。内部-内部トークン交換を使用していた場合は、新しい標準トークン交換への移行を検討してください。
レガシートークン交換を引き続き使用する場合は、以前のリリースと同じように動作することがわかります。標準トークン交換機能を無効にする必要はありません。クライアントは、Keycloakクライアントで有効になっている場合にのみ標準トークン交換を使用します。ただし、標準トークン交換への移行をお勧めします。これは、公式にサポートされている方法であり、機能拡張の優先順位が高くなります。
新しい標準トークン交換への移行を計画する際に、次の点に注意してください。
-
新しい標準トークン交換を表す機能
token-exchange-standard
は、デフォルトで有効になっています。リクエストが新しい標準トークン交換によって処理されるようにするために、レガシートークン交換を表すtoken-exchange
機能を無効にすることをお勧めします。 -
標準トークン交換機能とレガシートークン交換機能の両方を有効にすることができます。これは、標準ユースケース(内部-内部)と、レガシートークン交換によってのみ実装される他のトークン交換ユースケースをカバーする必要がある場合に役立ちます。たとえば、外部から内部へのトークン交換は、レガシートークン交換によってのみ実装されます。この場合、Keycloakは標準の内部-内部リクエストを標準トークン交換によって優先的に処理しますが、他のリクエストはレガシートークン交換によって処理されます。標準またはレガシートークン交換の選択は、特定のリクエストのパラメーターに基づいて決定されます。たとえば、
requested_issuer
やrequested_subject
などの非標準パラメーターを含むリクエストは、レガシーと見なされます。レガシートークン交換がまだ必要な場合は、詳細な管理者権限バージョン1(FGAP:v1)も有効にする必要があります。バージョン2(FGAP:v2)はトークン交換権限をサポートしていないためです。これは意図的なものであり、トークン交換は概念的には実際には「管理者」権限ではないため、トークン交換権限はFGAP:v2に追加されませんでした。
-
標準トークン交換では、トークン交換ドキュメントで説明されているように、クライアントでスイッチを有効にする必要があります。
2種類のトークン交換の動作におけるこれらの追加の変更を検討してください。
-
詳細な管理者権限は、標準トークン交換では不要であり、サポートされなくなりました。
-
スコープとオーディエンスの動作に関する最も注目すべき変更は、適用されるクライアントスコープが、
audience
パラメーターで指定された「ターゲット」クライアントではなく、トークン交換リクエストをトリガーするクライアントに基づいていることです。仕様に記載されているように、audience
パラメーターの複数の値がサポートされています。詳細については、トークン交換ドキュメントを参照してください。 -
パブリッククライアントは、トークン交換リクエストを送信できなくなりました。レガシートークン交換では、パブリッククライアントは元のトークンダウンスコープするために、トークンを自分自身と交換することができました。このユースケースは代わりに、OAuth2仕様に記載されているように、
scope
パラメーターを使用してリフレッシュされたアクセストークンダウンスコープできるリフレッシュトークングラントを使用することでカバーできます。 -
アクセストークンをSAMLアサーションと交換することは、このリリースではサポートされていません。言い換えれば、
requested_token_type=urn:ietf:params:oauth:token-type:saml2
の使用はサポートされていません。 -
アクセストークンをリフレッシュトークンと交換することは、トークン交換ドキュメントに記載されているように、クライアントで明示的に有効になっている場合にのみ許可されます。現在、オフラインセッションから発行されたサブジェクトトークンがある場合に、オフライン トークンをリクエストしたり、リフレッシュ トークンを交換したりすることはサポートされていません。可能な場合は、リフレッシュトークンの代わりにアクセストークンを交換することをお勧めします。
詳細な管理者権限がサポートされています
このリリース以降、Keycloakは詳細な管理者権限V2を導入し、管理権限のための改善された、より柔軟な承認モデルを提供します。
-
FGAP:V2機能はデフォルトで有効になっています。
-
FGAP:V1機能はプレビューのままであり、
--features=admin-fine-grained-authz:v1
を使用して有効にできます。ただし、V1は非推奨となり、将来のリリースで削除される可能性があります。
V1からV2への移行
権限モデルの根本的な変更により、V1からV2への自動移行は利用できません。移行を簡素化するために
-
新しい
admin-permissions
クライアントが導入されました。このクライアントは、レルムの機能を有効にすると作成されます。クライアントは、FGAP:V2の承認モデルを保持します。 -
既存のFGAP:V1承認モデルは、
realm-management
クライアント内で変更されずに残ります。 -
管理者は、管理コンソールの更新された[権限]セクションで構成できる新しいモデルを使用して、権限とポリシーを再作成する必要があります。
FGAP:V1とFGAP:V2の主な違い
-
レルムレベルの有効化
-
FGAP:V2は、[レルム設定]の新しい[管理者権限]スイッチを使用してレルムに対して有効にできます。
-
-
集中管理
-
リソース固有の[権限]タブ(ユーザー、グループ、クライアント、およびロール用)が削除されました。
-
新しい[権限]セクションは、管理コンソールの1か所からすべての管理権限の集中管理を提供します。
-
-
明示的な操作スコープ
-
権限間の推移的な依存関係が削除されました。
-
管理者は、必要な各権限を明示的に割り当てる必要があります。
-
例:リソースを表示および管理するには、権限の[表示]スコープと[管理]スコープの両方を個別に割り当てる必要があります。
-
-
権限モデルの変更
-
user-impersonatedユーザー権限は削除されました。
-
configureクライアント権限は削除されました。 V2での明示的な操作スコープの導入により、管理と構成の区別が曖昧になりました。
-
user-impersonatedユーザー権限は削除されました。代わりに、
Groups
リソースタイプのimpersonate-members
スコープを使用して、グループメンバーの偽装を許可または拒否できます。 -
グループの
manage-members
権限では、レルム管理者によるグループからのメンバーの割り当て解除は許可されません。その理由は、V1 では、グループのメンバーが通常のレルムユーザーになることや、レルムでユーザーを作成するための回避策的な権限を許可していたためです。将来的には、グループからメンバーを削除するための追加スコープを提供する予定です。
-
-
柔軟なリソーススコープ
-
V1 とは異なり、権限は単一のリソース(クライアント、グループ、ロールの場合)またはすべてのリソース(ユーザーの場合)のいずれかに付与されていましたが、V2 ではより高い柔軟性が導入されています。
-
管理者は、次の権限を定義できるようになりました。
-
特定のリソース
-
選択されたリソースのセット
-
特定のタイプのすべてのリソース
-
これは、クライアント、ユーザー、グループ、ロールといったすべてのリソースタイプに適用されます。
-
-
LDAP プロバイダーがベース DN のサブ DN に新しいユーザー、グループ、ロールを保存できるようになりました
新しいユーザー、グループ、またはロールを追加する際、LDAP プロバイダーは常に検索用に設定された同じベース DN にそれらを保存していました。しかし、一部のデプロイメントでは、管理者は複数のサブ DN からユーザー(またはグループ/ロール)を取得するために subtree
スコープを持つより広範な DN を設定したい場合がありますが、新しいユーザー(またはグループ/ロール)を LDAP のこのベース DN に保存したくない場合があります。代わりに、それらの保存先としてサブ DN の 1 つを選択したいと考えています。
LDAP プロバイダーおよび LDAP グループとロールマッパーの新しい 相対ユーザー作成 DN
設定オプションを使用して、新しいユーザー、グループ、またはロールが作成される場所を制御できるようになりました。詳細については、LDAP 管理ガイドを確認してください。
X-XSS-Protection
ヘッダーの削除
X-XSS-Protection
ヘッダーは、Keycloak でサポートされているユーザーエージェントではもはやサポートされていないため、削除されました。このヘッダーは、Internet Explorer、Chrome、Safari の機能であり、リフレクティブクロスサイトスクリプティング (XSS) 攻撃を検出した場合にページの読み込みを停止していました。
ユーザーエージェントでのサポートの欠如、およびこの機能が コンテンツセキュリティポリシー (CSP) に取って代わられたため、これがデプロイメントに影響を与えるとは予想していません。
JWT クライアント認証がトークンの新しい最大有効期限オプションを定義
クライアントが 署名付き JWT または クライアントシークレット付き署名付き JWT タイプを使用して認証するように構成されている場合、Keycloak はトークンの最大有効期限を強制するようになりました。これは、トークンの exp
(有効期限) クレームがはるかに後である可能性がある場合でも、Keycloak はその最大有効期限より前に発行されたトークンを受け入れないことを意味します。デフォルト値は 60 秒です。JWT トークンは、認証のために送信される直前に発行する必要があることに注意してください。これにより、クライアントはログインのためにトークンを送信する 1 分間の猶予期間が得られます。それにもかかわらず、この有効期限はクライアントの 認証情報 タブの 最大有効期限 設定オプションを使用して調整できます (詳細については、サーバー管理ガイドの機密クライアント認証情報 を参照してください)。
26.1.3 への移行
注目すべき変更点
一般的な構成ミスを防ぎ、バグを修正し、Keycloakの実行を簡素化するために内部動作が変更された注目すべき変更。
資格情報のリセット後にフェデレーションユーザーに対してリセットメールを送信して再度ログインを強制する
以前は、資格情報リセットフロー (パスワードを忘れた場合 機能) は、同じ認証セッション (同じブラウザー) が使用されていた場合、資格情報のリセット後もユーザーをログイン状態のままにしていました。フェデレーションユーザープロバイダーの場合、この動作はセキュリティ上の問題となる可能性があります。ユーザーを 有効 として検出し、パスワードの変更を正常に実行するが、何らかの理由でユーザーパスワードの検証に失敗するプロバイダーの実装を想像してください。このシナリオでは、資格情報リセットフローにより、通常のブラウザーフローを使用してログインが許可されなかったはずのユーザーが、パスワードの変更が成功した後もログイン状態のままになることが許可されていました。このシナリオは一般的なケースではありませんが、デフォルトで回避する必要があります。
このため、認証器 reset-credential-email
(リセットメールを送信) には、force-login
(リセット後にログインを強制) という名前の新しい構成オプションが追加され、値として true
(常にログインを強制)、false
(同じ認証セッションが使用されている場合にユーザーをログイン状態のままにする以前の動作)、および only-federated
(フェデレーションユーザーに再度認証を強制し、Keycloak の内部データベースに保存されているユーザーに対して以前の動作を維持するデフォルト値) があります。
このオプションの変更に関する詳細については、パスワードを忘れた場合の有効化 を参照してください。
26.1.0 への移行
破壊的な変更
互換性を損なう変更とは、既存のユーザーが構成を変更する必要がある変更として識別されます。
このリリースには、パブリック API またはドキュメント化された動作に対する破壊的な変更はありません。
注目すべき変更点
一般的な構成ミスを防ぎ、バグを修正し、Keycloakの実行を簡素化するために内部動作が変更された注目すべき変更。
offline_scope
が最初の交換でリクエストされた場合、オフラインアクセスは関連付けられたオンラインセッションを削除します
Keycloak のオフラインセッションは、オンラインセッションから作成されます。offline_access
スコープがリクエストされると、現在のオンラインセッションは、クライアントの関連付けられたオフラインセッションを作成するために使用されます。したがって、offline_access
リクエストが完了すると、これまで、1 つのオンラインセッションと 1 つのオフラインセッションの 2 つのセッションが作成されていました。この状況は、信頼性の低い動作につながりました。たとえば、scope=offline_access
を使用したログインのみがリクエストされた場合、未使用のオンラインセッションが作成される可能性があり、これはほとんどの場合役に立ちません。この状況は、サーバーリソースの不必要な消費を引き起こしました。
このバージョンから、Keycloak は、offline_scope
がセッションの最初のインタラクションとして直接リクエストされた場合、最初のオンラインセッションを削除します。クライアントは、オフラインセッションに関連付けられているコードからトークンへの交換後にオフライン トークンを取得しますが、以前のオンライン セッションは削除されます。オンラインセッションが offline_scope
リクエストの前に、同じクライアントまたは別のクライアントによって使用されている場合、オンラインセッションは今日と同様にアクティブなままになります。この状況はまた、scope=offline_access
を使用したログインリクエストが使用され、ユーザーが SSO で事前に認証されていない場合、SSO セッションがブラウザーで作成されないことも意味します。新しい動作は、クライアントアプリケーションがオフライン トークンのみを要求しているため理にかなっていますが、最初の offline_scope
トークンリクエストの後もオンラインセッションをアクティブにしたままにすることに依存する一部のシナリオに影響を与える可能性があります。
client_credentials
グラントマッパー用の新しいクライアントスコープ service_account
Keycloak は、レルムレベルで service_account
という名前の新しいクライアントスコープを導入します。これは、プロトコルマッパーを介して client_credentials
グラント (client_id
、clientHost
、および clientAddress
) の特定のクレームを追加する役割を担います。このスコープは、クライアント構成で serviceAccountsEnabled
オプションが設定または設定解除されたときに、クライアントに自動的に割り当ておよび割り当て解除されます。
以前は、クライアントがサービスアカウントを有効にするように構成されていた場合、3 つのマッパー (Client Id
、Client Host
、および Client IP Address
) が専用スコープに直接追加され、削除されることはありませんでした。
トークン内のクレームは以前と事実上同じであるため、この動作はほとんどの Keycloak デプロイメントで事実上同じであるはずです。クライアント資格情報グラントを使用しており、上記の 3 つのプロトコルマッパーを手動で削除または更新する何らかのツールを使用して Keycloak 環境を準備している場合に影響を受ける可能性があります。たとえば、管理者 CLI スクリプトを使用してクライアントのサービスアカウントを有効にし、組み込みのサービスアカウントプロトコルマッパーを削除する場合、プロトコルマッパーを削除する代わりに、クライアントから service_account
クライアントスコープの割り当てを削除するように CLI を調整できます。
非推奨通知
これは、このリリースでは以前と同様に動作し続けるが、将来のメジャーリリースで削除される機能をリストしています。
本番環境用のデフォルトの db
オプションは非推奨になりました。
以前のリリースでは、db
オプションは、本番環境 (start
) モードと開発 (start-dev
) モードの両方でデフォルトで dev-file
になっていましたが、dev-file
は本番環境モードではサポートされていませんでした。このリリースでは、この動作は非推奨となり、将来のリリースでは、本番環境モードで db
オプションがデフォルトで dev-file
になることはありません。本番環境プロファイルでの build
または非最適化 start
および非サーバーコマンド import
、export
、または bootstrap-admin
の場合、値を明示的に指定する必要があります。これは、本番環境での dev-file
(H2) データベースの意図しない使用を防ぐためであり、通常は構成の誤りを示しています。
JavaScript Authorization クライアントの非推奨 API
JavaScript Authorization クライアントの次の API は非推奨であり、次のメジャーリリースで削除されます
-
KeycloakAuthorization
インスタンスのready
プロパティ。 -
KeycloakAuthorization
インスタンスのinit()
メソッド。
これらの API は、KeycloakAuthorization
インスタンスでメソッドを呼び出すとオンデマンドで初期化が自動的に行われるため、もはや必要ありません。これらの API に依存するコードは安全に削除できます。
OIDC クライアントからの登録を開始するための非推奨エンドポイント
OIDC クライアントによる登録の開始に使用されていた /realms/<realm>/protocol/openid-connect/registrations
エンドポイントは、OIDC クライアントから登録を開始するための標準的な方法が存在するため、非推奨になりました。この方法は、現在 Keycloak でサポートされています。パラメーター prompt=create
を使用します。
26.0.6 への移行
キーリゾルバーのセキュリティ改善
REALM_FILESEPARATOR_KEY
キーリゾルバーを使用している場合、Keycloak は FileVault シークレットへのアクセスをレルムの外部に制限するようになりました。管理コンソールで式プレースホルダーを指定する際にパス トラバーサルを引き起こす可能性のある文字は、禁止されるようになりました。
さらに、KEY_ONLY
キーリゾルバーは、REALM_UNDERSCORE_KEY
リゾルバーが使用されている場合に、別のレルムにリンクされるはずのシークレットの読み取りを防ぐために _
文字をエスケープするようになりました。エスケープは単に _
を __
に置き換えるため、たとえば、${vault.my_secret}
は my__secret
という名前のファイルを検索するようになりました。これは破壊的な変更であることを認識しています。したがって、移行を容易にするために警告がログに記録されます。
26.0.0 への移行
Infinispan マーシャリングの変更
マーシャリングは、Java オブジェクトをバイトに変換して、Keycloak サーバー間でネットワーク経由で送信するプロセスです。Keycloak 26 では、マーシャリングライブラリが JBoss Marshalling から Infinispan Protostream に変更されました。ライブラリは相互に互換性がなく、セッションデータが失われないようにするためのいくつかの手順が必要です。
JBoss Marshalling と Infinispan Protostream は相互に互換性がなく、誤った使用法はデータ損失につながる可能性があります。その結果、このバージョンにアップグレードすると、すべてのキャッシュがクリアされます。 |
ユーザーセッションの損失を防ぐために、まず Keycloak 25 にアップグレードし、Keycloak 25 の移行ガイドで概説されているように、永続セッション機能を有効にしてください。
Operator が proxy=passthrough をデフォルトとしなくなりました
Operator は、hostname v1 設定の proxy=passthrough をデフォルトとしなくなります。これにより、固定エッジ ホスト名に hostname v2 を使用するデプロイメントは、追加のオプションなしで意図したとおりに動作できます。
ClusterProvider
API の新しいメソッド
次のメソッドが org.keycloak.cluster.ClusterProvider
に追加されました
-
void notify(String taskKey, Collection<? extends ClusterEvent> events, boolean ignoreSender, DCNotify dcNotify)
複数のイベントが同じ taskKey
に送信される場合、このメソッドはイベントをバッチ処理し、単一のネットワーク呼び出しのみを実行します。これは、トラフィックとネットワーク関連のリソースを削減するための最適化です。
Keycloak 26 では、新しいメソッドにはカスタム実装との下位互換性を維持するためのデフォルト実装があります。デフォルトの実装は、イベントごとに単一のネットワーク呼び出しを実行し、Keycloak の将来のバージョンで削除されます。
レルムを削除するときにグループ関連のイベントがトリガーされなくなりました
グループのスケーラビリティを向上させる目的で、レルムを削除すると、グループがデータベースから直接削除されるようになりました。その結果、レルムを削除するときに GroupRemovedEvent
のようなグループ関連のイベントがトリガーされなくなりました。
レルムが削除されたときにグループ関連のイベントを処理する拡張機能がある場合は、レルムとそのグループが削除されたときにクリーンアップまたはカスタム処理を実行するために、代わりに RealmRemovedEvent
を使用するようにしてください。
GroupProvider
インターフェイスも、レルムが削除されたときにグループの削除を適切に処理するために実装を強制する新しい preRemove(RealmModel)
メソッドで更新されます。
ルートから相対パスへの自動リダイレクト
http-relative-path
プロパティが指定されている場合、ユーザーは Keycloak がホストされているパスに自動的にリダイレクトされます。つまり、相対パスが /auth
に設定されていて、ユーザーが localhost:8080/
にアクセスすると、ページは localhost:8080/auth
にリダイレクトされます。
http-management-relative-path
または http-relative-path
プロパティが指定されている場合、管理インターフェイスにも同じことが当てはまります。
ユーザーは URL に相対パスを明示的に設定する必要がなくなるため、ユーザーエクスペリエンスが向上します。
Operator スケジューリングのデフォルト
Keycloak Pod は、同じ CR からの複数のインスタンスが同じノードにデプロイされるのを防ぐためのデフォルトのアフィニティを持つようになり、同じ CR からのすべての Pod は、ストレッチキャッシュクラスターを防ぐために同じゾーンに配置されることを優先します。
Operator のデフォルト CPU およびメモリ制限/リクエスト
ベストプラクティスに従うために、Operator のデフォルトの CPU およびメモリ制限/リクエストが導入されました。これは、非 OLM および OLM インストールの両方に影響します。OLM インストールのデフォルト値をオーバーライドするには、operator の サブスクリプション の resources
セクションを編集します。
keycloak-common
モジュールの非推奨
次の項目は、今後の Keycloak バージョンで削除するために非推奨となり、代替はありません
-
org.keycloak.common.util.reflections.Reflections.newInstance(java.lang.Class<T>)
-
org.keycloak.common.util.reflections.Reflections.newInstance(java.lang.Class<?>, java.lang.String)
-
org.keycloak.common.util.reflections.SetAccessiblePrivilegedAction
-
org.keycloak.common.util.reflections.UnSetAccessiblePrivilegedAction
URL エンコードでの UTF-8 文字セットの一貫した使用
org.keycloak.common.util.Encode
は、file.encoding
システムプロパティに暗黙的に依存する代わりに、URL エンコードに常に UTF-8
文字セットを使用するようになりました。
LDAP 接続プールの構成
このリリースでは、LDAP 接続プールの構成はシステムプロパティのみに依存しています。主な理由は、LDAP 接続プールの構成が、個々のレルムまたは LDAP プロバイダーインスタンスに固有のものではなく、JVM レベルの構成であるためです。
以前のリリースと比較して、LDAP 接続プールに関連するレルム構成は無視されます。次の設定のいずれかが LDAP プロバイダーに設定されている以前のバージョンから移行する場合は、代わりにシステムプロパティを使用することを検討してください
-
connectionPoolingAuthentication
-
connectionPoolingInitSize
-
connectionPoolingMaxSize
-
connectionPoolingPrefSize
-
connectionPoolingTimeout
-
connectionPoolingProtocol
-
connectionPoolingDebug
詳細については、接続プールの構成 を参照してください。
ログインテーマのカスタムフッター
このリリースでは、base/login
および keycloak.v2/login
テーマのログインページにカスタムフッターを簡単に追加する機能が導入されました。カスタムフッターを使用するには、目的のコンテンツを含む footer.ftl
ファイルをカスタムログインテーマに作成します。
詳細については、ログインテーマへのカスタムフッターの追加 を参照してください。
再起動をまたいで失効したアクセストークンを永続化する
このリリースでは、組み込みキャッシュを使用する場合、デフォルトで失効したアクセストークンがデータベースに書き込まれ、クラスターが再起動されるとリロードされます。
この動作を無効にするには、すべてのプロバイダー構成 ガイドで概説されているように、SPI オプション spi-single-use-object-infinispan-persist-revoked-tokens
を使用します。
SingleUseObjectProvider
の SPI 動作が変更され、失効したトークンについては、put
および contains
メソッドのみを使用する必要があります。これはデフォルトで強制され、SPI オプション spi-single-use-object-infinispan-persist-revoked-tokens
を使用して無効にできます。
高可用性マルチサイトデプロイメント
Keycloak 26 では、推奨される HA マルチサイトアーキテクチャに大幅な改善が加えられました。最も注目すべきは次のとおりです
-
Keycloak デプロイメントは、両方のサイトでユーザーリクエストを同時に処理できるようになりました。一度に 1 つのサイトでのみリクエストを処理する以前のロードバランサー構成は引き続き機能します。
-
障害が発生した場合のサイト間のレプリケーションには、サイト間の接続のアクティブな監視が必須になりました。ブループリントでは、Alertmanager と AWS Lambda を使用したセットアップについて説明しています。
-
ロードバランサーのブループリントは、AWS Global Accelerator を使用するように更新されました。これにより、クライアントによる DNS キャッシュによって引き起こされるフェイルオーバー時間の長期化を回避できます。
-
永続ユーザーセッションは、アーキテクチャの要件になりました。その結果、ユーザーセッションは Keycloak または Infinispan のアップグレードで保持されます。
-
外部 Infinispan リクエスト処理が改善され、メモリ使用量とリクエストレイテンシが削減されました。
上記の変更の結果として、既存の Keycloak デプロイメントには次の変更が必要です。
-
multi-site
機能が有効になっている場合、キャッシュ構成ファイルによって提供されるdistributed-cache
定義は無視されるため、ブループリントで概説されているように、cache-remote-*
コマンドライン引数または Keycloak CR を介して外部 Infinispan デプロイメントへの接続を構成する必要があります。すべてのremote-store
構成は、キャッシュ構成ファイルから削除する必要があります。 -
外部 Infinispan の現在のキャッシュ構成を確認し、Keycloak のドキュメントの最新バージョンで概説されている構成で更新します。以前のバージョンのキャッシュ構成では、サイト間のバックアップレプリケーションが失敗した場合に警告のみがログに記録されていましたが、新しい構成では、両方のサイトの状態が同期された状態に保たれるようになっています。2 つのサイト間の転送が失敗すると、呼び出し元にエラーが表示されます。そのため、サイト障害が発生した場合に 2 つのサイトを切り離すための監視を設定する必要があります。Keycloak 高可用性ガイドには、この設定方法に関するブループリントが含まれています。
-
以前のロードバランサー構成は Keycloak で引き続き機能しますが、クライアント側の DNS キャッシュによるフェイルオーバー時間の長期化を回避するために、既存の Route53 構成をアップグレードすることを検討してください。
-
リモートストア構成でキャッシュ構成 XML ファイルを更新した場合、それらは機能しなくなります。代わりに、
multi-site
機能を有効にし、cache-remove-*
オプションを使用します。
シングルサイトセットアップでの外部 Infinispan
シングルサイトセットアップで外部 Infinispan を使用している場合、これは以前のバージョンの Keycloak ではサポートされておらず、Keycloak 26 でもサポートされていません。Keycloak のキャッシュ XML または CLI オプションでの手動構成による偶発的な使用からユーザーを保護するために、これは現在フィーチャーフラグ cache-embedded-remote-store
で保護されています。これは実験的としてマークされており、したがってサポートされていません。Keycloak 26 は、このような構成では起動せず、この実験的機能が有効になっていない限り、代わりにエラーを表示します。
再起動とアップグレードの間でユーザーをログイン状態に保つために外部 Infinispan を使用していた場合は、代わりにデフォルトで有効になっている persistent-user-sessions
機能を使用してください。その後、外部 Infinispan は不要になります。
実験的機能 cache-embedded-remote-store
は、将来のマイナーリリースで削除されます。
管理者ブートストラップとリカバリ
すべての管理者ユーザーがロックアウトされた場合、Keycloak インスタンスへのアクセスを回復するのは困難でした。このプロセスには、データベースへの直接アクセスや手動による変更など、複数の高度な手順が必要でした。ユーザーエクスペリエンスを向上させるために、Keycloak は新しい管理者アカウントをブートストラップするための複数の方法を提供するようになり、このような状況からの回復に使用できます。
その結果、環境変数 KEYCLOAK_ADMIN
および KEYCLOAK_ADMIN_PASSWORD
は非推奨になりました。代わりに KC_BOOTSTRAP_ADMIN_USERNAME
および KC_BOOTSTRAP_ADMIN_PASSWORD
を使用する必要があります。これらは一般的なオプションでもあるため、CLI またはその他の構成ソース (たとえば --bootstrap-admin-username=admin
) を介して指定できます。詳細については、新しい 管理者ブートストラップとリカバリ ガイドを参照してください。
アプリケーションによって開始された必要なアクションのリダイレクトに kc_action パラメーターが含まれるようになりました
必要なアクションプロバイダー名は、アプリケーションによって開始された必要なアクションの実行からリダイレクトバックするときに、kc_action
パラメーターを介して返されるようになりました。これにより、クライアントに対してどの必要なアクションが実行されたかを簡単に検出できます。実行の結果は、kc_action_status
パラメーターを介して判断できます。
注: この機能には Keycloak JS アダプターの変更が必要だったため、この機能を活用する場合は、アダプターの最新バージョンにアップグレードすることをお勧めします。
keycloak-services
モジュールの非推奨
クラス UserSessionCrossDCManager
は非推奨であり、Keycloak の将来のバージョンで削除される予定です。使用する代替メソッドについては、UserSessionCrossDCManager
Javadoc を参照してください。
レルム表現から ID プロバイダーが利用できなくなりました
レルムと組織が多数の ID プロバイダーを持っている場合のスケーラビリティに関する改善の一環として、レルム表現は ID プロバイダーのリストを保持しなくなりました。ただし、レルムをエクスポートすると、レルム表現から引き続き利用できます。
レルム内の ID プロバイダーをクエリするには、/realms/{realm-name}/identity-provider/instances
エンドポイントを使用することをお勧めします。このエンドポイントは、フィルターとページネーションをサポートしています。
CLI インポートプレースホルダーの置換
CLI コマンド kc.[sh|bat] import
でプレースホルダーの置換が有効になりました。以前は、プレースホルダーの置換は起動時のレルムインポートでのみ有効になっていました。
import
コマンドのプレースホルダーの置換を無効にする場合は、システムプロパティ -Dkeycloak.migration.replace-placeholders=false
を追加します
名前でレルムを検索するための新しい Java API
RealmProvider
Java API に、名前でレルムを検索できる新しいメソッド Stream<RealmModel> getRealmsStream(String search)
が含まれるようになりました。プロバイダーからロードした後にストリームをフィルタリングするデフォルト実装がありますが、実装ではこれをより効率的な実装で提供することが推奨されます。
キーストアとトラストストアのデフォルト形式の変更
Keycloak は、ファイル拡張子に基づいてキーストアとトラストストアの形式を決定するようになりました。ファイル拡張子が .p12
、.pkcs12
、または .pfx
の場合、形式は PKCS12 です。ファイル拡張子が .jks
、.keystore
、または .truststore
の場合、形式は JKS です。ファイル拡張子が .pem
、.crt
、または .key
の場合、形式は PEM です。
https-key-store-type
および https-trust-store-type
を明示的に指定することで、自動検出をオーバーライドすることもできます。管理インターフェイスとその https-management-key-store-type
にも同じことが当てはまります。FIPS 厳密モードの制限は変更されていません。
spi-truststore-file-* オプションと、トラストストア関連のオプション https-trust-store-* は非推奨になりました。システムトラストストアを使用することを強くお勧めします。詳細については、関連する ガイド を参照してください。 |
ID プロバイダーの選択のパフォーマンスの向上
組織に関連付けられた IDP を取得するクエリ、およびログインに使用できる IDP (enabled
、link_only
ではない、hide_on_login
としてマークされていないもの) を取得するクエリのパフォーマンスを向上させるために、新しいインデックスが IDENTITY_PROVIDER
テーブルに追加されました。
テーブルに現在 300,000 を超えるエントリが含まれている場合、Keycloak は自動スキーマ移行中にデフォルトでインデックスの作成をスキップし、代わりに移行中に SQL ステートメントをコンソールにログ記録します。この場合、Keycloak の起動後に DB でステートメントを手動で実行する必要があります。
また、kc.org
および hideOnLoginPage
構成属性が ID プロバイダー自体に移行され、プロバイダーを検索するときにクエリをより効率的に実行できるようになりました。そのため、API クライアントは IdentityProviderRepresentation
で getOrganizationId/setOrganizationId
および isHideOnLogin/setHideOnLogin
メソッドを使用し、現在非推奨になっているレガシー構成属性を使用してこれらのプロパティを設定することは避ける必要があります。
GELF ロギングハンドラーの削除
GELF サポートはしばらくの間非推奨となっていましたが、このリリースで Keycloak から完全に削除されました。他のログハンドラーは利用可能であり、GELF の代替として使用することが完全にサポートされています (Syslog など)。詳細については、ロギングガイド を参照してください。
common
テーマリソースのパスが変更されました
keycloak
テーマの common
リソースの一部のパスが変更されました。具体的には、サードパーティライブラリのリソースです。カスタムテーマを適宜更新してください
-
node_modules/patternfly/dist
がvendor/patternfly-v3
になりました -
node_modules/@patternfly/patternfly
がvendor/patternfly-v4
になりました -
node_modules/@patternfly-v5/patternfly
がvendor/patternfly-v5
になりました -
node_modules/rfc4648/lib
がvendor/rfc4648
になりました
さらに、次のリソースが common
テーマから削除されました
-
node_modules/alpinejs
-
node_modules/jquery
以前にテーマで削除されたリソースのいずれかを使用していた場合は、代わりにそれらを独自のテーマリソースに追加するようにしてください。
追加のデータソースで XA の使用が必須になりました
Keycloak はデフォルトでは XA データソースを使用しません。ただし、複数のデータソースを使用する場合は、これは安全でないと見なされます。このリリース以降、Keycloak に追加のデータソースを追加する場合は、XA データソースを使用する必要があります。デフォルトのデータソースが XA をサポートしている場合は、--transaction-xa-enabled=true
オプションを設定することでこれを行うことができます。追加のデータソースの場合は、quarkus.properties
ファイルで quarkus.datasource.<your-datasource-name>.jdbc.transactions=xa
オプションを使用する必要があります。XA でないデータソースは最大で 1 つにすることができます。トランザクションストアの永続ストレージがない場合、リカバリはサポートされていません。
Hostname v1 機能が削除されました
非推奨となった hostname v1 機能は削除されました。この機能は Keycloak 25 で非推奨となり、hostname v2 に置き換えられました。この機能をまだ使用している場合は、hostname v2 に移行する必要があります。詳細については、ホスト名の設定 (v2) および 初期移行ガイド を参照してください。
プロキシオプションの削除
非推奨となった proxy
オプションは削除されました。このオプションは Keycloak 24 で非推奨となり、必要に応じてホスト名オプションと組み合わせて proxy-headers
オプションに置き換えられました。詳細については、リバースプロキシの使用 および 初期アップグレードガイド を参照してください。
すべてのユーザーセッションがデフォルトで永続化されるようになりました
データベースがユーザーセッションの信頼できる情報源となったため、メモリ使用量を削減するためにセッションキャッシュのサイズを制限することが可能です。デフォルトの conf/cache-ispn.xml
ファイルを使用する場合、ユーザーおよびクライアントセッションを格納するキャッシュは、デフォルトで 10000 セッションと各エントリにつき 1 オーナーのみを格納するように設定されています。
カスタムの組み込み Infinispan キャッシュ設定ファイルを、以下のキャッシュ sessions
、clientSessions
、offlineSessions
、および offlineClientSessions
の設定例と同様に更新してください。
<distributed-cache name="sessions" owners="1"> <!-- other configuration --> <memory max-count="10000"/> </distributed-cache>
詳細については、分散キャッシュの設定 ガイドに進んでください。
永続セッションが有効な場合、アイドルセッションの猶予期間が削除されました
以前のバージョンの Keycloak では、ユーザーおよびクライアントセッションのアイドル時間に 2 分間の猶予期間が追加されていました。これは、セッション更新時間がクラスター内で非同期的にレプリケートされる以前のアーキテクチャによるものでした。永続ユーザーセッションでは、これはもはや不要となり、そのため猶予期間は削除されました。
以前の動作を維持するには、レルム構成を更新し、セッションおよびクライアントのアイドル時間を 2 分間延長してください。
従来の redirect_uri
パラメータと SPI オプションのサポートが削除されました
以前のバージョンの Keycloak では、http(s)://example-host/auth/realms/my-realm-name/protocol/openid-connect/logout?redirect_uri=encodedRedirectUri
のようなログアウトエンドポイント URL を開くことで、ユーザーの自動ログアウトとアプリケーションへのリダイレクトがサポートされていました。この機能は Keycloak 18 で非推奨となり、今回のバージョンで OpenID Connect 仕様に従うことを優先して削除されました。
この変更の一環として、SPI の以下の関連する構成オプションが削除されました。
-
--spi-login-protocol-openid-connect-legacy-logout-redirect-uri
-
--spi-login-protocol-openid-connect-suppress-logout-confirmation-screen
これらのオプションまたはログアウト用の redirect_uri
パラメータをまだ使用している場合は、代わりに OpenID Connect RP-Initiated Logout 仕様 を実装する必要があります。
--optimized
起動オプションに関する追加の検証
--optimized
起動オプションを使用するには、最適化されたサーバーイメージを最初にビルドする必要があります。これは、最初に kc.sh|bat build
を実行するか、--optimized
フラグなしで他のサーバーコマンド (start
、export
、import
など) を実行することで実現できます。
アダプターおよび misc BOM ファイルが削除されました
org.keycloak.bom:keycloak-adapter-bom
および org.keycloak.bom:keycloak-misc-bom
BOM ファイルが削除されました。アダプター BOM は、ほとんどの Java アダプターが削除されたため、もはや有用ではありませんでした。misc BOM には 1 つのアーティファクト、keycloak-test-helper
のみが含まれていましたが、そのアーティファクトも今回のリリースで削除されました。
keycloak-test-helper が削除されました
maven アーティファクト org.keycloak:keycloak-test-helper
が今回のリリースで削除されました。このアーティファクトは、Java 管理クライアントを扱うためのいくつかのヘルパーメソッドを提供していました。ヘルパーメソッドを使用している場合は、必要に応じてアプリケーションにフォークすることが可能です。
資格情報の新しい汎用イベントタイプ
資格情報の更新 (UPDATE_CREDENTIAL
) および削除 (REMOVE_CREDENTIAL
) のための汎用イベントが追加されました。資格情報のタイプは、イベントの credential_type
属性で記述されています。新しいイベントタイプは、Email Event Listener でサポートされています。
以下のイベントタイプは非推奨となり、将来のバージョンで削除される予定です: UPDATE_PASSWORD
、UPDATE_PASSWORD_ERROR
、UPDATE_TOTP
、UPDATE_TOTP_ERROR
、REMOVE_TOTP
、REMOVE_TOTP_ERROR
--import-realm
オプションで master レルムをインポートできるようになりました
master レルムが存在する前に --import-realm
オプションを指定して start
または start-dev
コマンドを実行すると、インポートマテリアルに master レルムが存在する場合、インポートされるようになります。以前の動作では、master レルムが最初に作成され、そのインポートはスキップされていました。
BouncyCastle FIPS が更新されました
FIPS 140-2 統合は、バージョン 2 の BouncyCastle FIPS ライブラリでテストされ、サポートされるようになりました。このバージョンは Java 21 で認証されています。FIPS 140-2 統合を使用する場合は、最新のドキュメントに記載されているバージョンに BouncyCastle FIPS ライブラリをアップグレードすることをお勧めします。
BouncyCastle FIPS バージョン 2 は FIPS 140-3 で認証されています。したがって、Keycloak は FIPS 140-3 準拠システムで使用されている限り、FIPS 140-3 に準拠できます。これは、RHEL 9 ベースのシステム (それ自体が FIPS 140-3 に準拠) である可能性があります。ただし、RHEL 8 ベースのシステムは FIPS 140-2 のみで認証されていることに注意してください。
JavaScript Admin Client から setOrCreateChild()
メソッドが削除されました
groups.setOrCreateChild()
メソッドが JavaScript ベースの Admin Client から削除されました。このメソッドをまだ使用している場合は、代わりに createChildGroup()
または updateChildGroup()
メソッドを使用してください。
Keycloak JS
今回のリリースには、考慮すべき Keycloak JS ライブラリへのいくつかの変更が含まれています。これらの変更の主な動機は、ライブラリを Keycloak サーバーから分離し、独立してリファクタリングできるようにすることで、コードを簡素化し、将来のメンテナンスを容易にすることです。変更点は以下のとおりです。
ライブラリはサーバーから静的に提供されなくなりました
Keycloak JS ライブラリは、Keycloak サーバーから静的に提供されなくなりました。これは、以下の URL が利用できなくなったことを意味します。
-
/js/keycloak-authz.js
-
/js/keycloak-authz.min.js
-
/js/keycloak.js
-
/js/keycloak.min.js
-
/js/{version}/keycloak-authz.js
-
/js/{version}/keycloak-authz.min.js
-
/js/{version}/keycloak.js
-
/js/{version}/keycloak.min.js
さらに、これらの URL 上のライブラリにリンクしていた keycloakJsUrl
プロパティが管理コンソールテーマから削除されました。カスタムテーマでこのプロパティを使用してライブラリを含めていた場合は、別の方法を使用してライブラリを含めるようにテーマを更新する必要があります。
まだの場合は、NPM のようなパッケージマネージャーを使用してプロジェクトにライブラリを含める必要があります。ライブラリは NPM レジストリで keycloak-js
として利用可能です。以下のコマンドを使用してインストールできます。
npm install keycloak-js
あるいは、サーバーのディストリビューションには、keycloak-js-26.0.0.tgz
アーカイブにライブラリのコピーが含まれています。そこからライブラリをプロジェクトにコピーできます。ビルドなしでブラウザでライブラリを直接使用している場合は、ライブラリを自分でホストする必要があります。パッケージマネージャーは、今後ライブラリを更新しやすくするため、プロジェクトにライブラリを含める推奨される方法です。
UMD ディストリビューションのサポートが削除されました
Keycloak JS ライブラリの UMD ディストリビューション Universal Module Definition が削除されました。これは、ライブラリがグローバル変数として公開されなくなり、代わりに モジュール としてインポートする必要があることを意味します。この変更は、最新の JavaScript 開発プラクティスに沿ったものであり、ブラウザとビルドツール間でより一貫したエクスペリエンスを可能にし、一般的に副作用の少ない、より予測可能なコードにつながります。
Vite や Webpack のようなバンドラーを使用している場合は、何も変更はなく、以前と同じエクスペリエンスが得られます。ブラウザでライブラリを直接使用している場合は、モジュールとしてライブラリをインポートするようにコードを更新する必要があります。
<!-- Before -->
<script src="/path/to/keycloak.js"></script>
<script>
const keycloak = new Keycloak();
</script>
<!-- After -->
<script type="module">
import Keycloak from '/path/to/keycloak.js';
const keycloak = new Keycloak();
</script>
インポートマップ を使用して、ライブラリのインポートをより簡潔にすることもできます。
<script type="importmap">
{
"imports": {
"keycloak-js": "/path/to/keycloak.js"
}
}
</script>
<script type="module">
// The library can now be imported without specifying the full path, providing a similar experience as with a bundler.
import Keycloak from 'keycloak-js';
const keycloak = new Keycloak();
</script>
TypeScript を使用している場合は、ライブラリを解決できるように tsconfig.json
を更新する必要がある場合があります。
{
"compilerOptions": {
"moduleResolution": "Bundler"
}
}
Keycloak
インスタンスの設定が必須になりました
以前は、設定を渡さずに Keycloak
インスタンスを構築することができました。設定は、含まれている keycloak.js
スクリプトのパスに基づいて、サーバーから keycloak.json
ファイルから自動的にロードされていました。ライブラリがサーバーから静的に提供されなくなったため、この機能は削除されました。Keycloak
インスタンスを構築するときは、明示的に設定を渡す必要があります。
// Before
const keycloak = new Keycloak();
// After
const keycloak = new Keycloak({
url: "http://keycloak-server",
realm: "my-realm",
clientId: "my-app"
});
// Alternatively, you can pass a URL to a `keycloak.json` file.
// Note this is not recommended as it creates additional network requests, and is prone to change in the future.
const keycloak = new Keycloak('http://keycloak-server/path/to/keycloak.json');
ログインメソッドが async
になりました
Keycloak JS は、さまざまな暗号化機能に Web Crypto API を利用するようになりました。この API の非同期的な性質により、以下の公開メソッドは常に Promise
を返すようになります。
-
login()
-
createLoginUrl()
-
createRegisterUrl()
これらのメソッドを await
するようにコードを更新してください。
// Before
keycloak.login();
const loginUrl = keycloak.createLoginUrl();
const registerUrl = keycloak.createRegisterUrl();
// After
await keycloak.login();
const loginUrl = await keycloak.createLoginUrl();
const registerUrl = await keycloak.createRegisterUrl();
これらのメソッドを await
するようにコードを更新してください。
セキュアコンテキストが必須になりました
Keycloak JS は、実行するために セキュアコンテキスト を必要とするようになりました。その理由は、ライブラリがさまざまな暗号化機能に Web Crypto API を使用するようになったためです。この API は、HTTPS、localhost
、または .localhost
ドメイン経由で提供されるコンテキストであるセキュアコンテキストでのみ利用可能です。非セキュアコンテキストでライブラリを使用している場合は、セキュアコンテキストを使用するように開発環境を更新する必要があります。
25.0.3 への移行
ブルートフォースが有効な場合、同時ログインリクエストがデフォルトでブロックされるようになりました
攻撃者が多数のログイン試行を並行して開始した場合、攻撃者はブルートフォース保護構成で許可されているよりも多くのパスワードを推測できる可能性がありました。これは、ブルートフォースチェックがブルートフォースプロテクターがユーザーをロックする前に行われていたためです。この競合を防ぐために、ブルートフォースプロテクターは、同じサーバーで別のログインが進行中に発生するすべてのログイン試行を拒否するようになりました。
何らかの理由で、新機能を無効にしたい場合は、起動ファクトリオプションがあります。
bin/kc.[sh|bat] start --spi-brute-force-protector-default-brute-force-detector-allow-concurrent-requests=true
25.0.2 への移行
ユーザー同意の削除のパフォーマンスの向上
クライアントスコープまたはレルム全体が削除されると、関連付けられたユーザー同意も削除する必要があります。テーブル USER_CONSENT_CLIENT_SCOPE
に新しいインデックスが追加され、パフォーマンスが向上しました。
テーブルに 300,000 件を超えるエントリが含まれている場合、デフォルトでは Keycloak は自動スキーマ移行中にインデックスの作成をスキップし、代わりに SQL ステートメントをコンソールに記録することに注意してください。ステートメントは、Keycloak の起動後に DB で手動で実行する必要があります。異なる制限を構成する方法の詳細については、アップグレードガイド を確認してください。
25.0.0 への移行
新しいホスト名オプション
古いホスト名オプションは非推奨となり、今後のリリースで削除される予定であるため、hostname v2 オプションがデフォルトでサポートされています。新しいオプションはデフォルトで有効になっているため、Keycloak は古いオプションを認識しません。
必要な移行のリスト
古いオプション | 新しいオプション |
---|---|
|
|
|
|
|
|
ご覧のとおり、hostname
および hostname-admin
オプションの *-url
サフィックスが削除されました。オプション hostname
はホスト名と URL の両方を受け入れますが、hostname-admin
は完全な URL のみを受け入れるようになりました。
さらに、path
または port
を個別に設定する方法はありません。hostname
および hostname-admin
オプションに完全な URL を指定することで実現できます。
ポートが URL の一部でない場合、受信リクエストヘッダーから動的に解決されます。
HTTPS は、hostname
および hostname-admin
URL の一部でない限り、強制されなくなりました。指定されていない場合、使用されるプロトコル (http/https
) は、受信リクエストから動的に解決されます。hostname-strict-https
オプションは削除されました。
削除されたオプション |
---|
|
|
|
|
|
|
移行のための時間を確保するために古いホスト名オプションを使用するには、機能 hostname:v1 (例: features=hostname:v1 ) をオンにします。hostname:v1 または hostname:v2 のいずれか一方のみを有効にでき、両方を同時に有効にすることはできないことに注意してください。 |
例
# Hostname v1
bin/kc.[sh|bat] start --hostname=mykeycloak.org --https-port=8543 --hostname-path=/auth --hostname-strict-https=true
# Hostname v2
bin/kc.[sh|bat] start --hostname=https://mykeycloak.org:8543/auth
例でわかるように、URL のすべての部分を単一の hostname
オプションで指定できるようになり、ホスト名の設定プロセスが簡素化されました。HTTPS は hostname-strict-https
オプションではなく、ホスト名 URL で指定することで強制されることに注意してください。
# Hostname v1
bin/kc.[sh|bat] start --hostname=mykeycloak.org --hostname-strict-backchannel=true
# Hostname v2
bin/kc.[sh|bat] start --hostname=mykeycloak.org --hostname-backchannel-dynamic=false
バックエンドとフロントエンドの両方のエンドポイントに同じ URL を使用する場合、動作が変更されることに注意してください。以前の hostname v1 では、バックチャネル URL はリクエストヘッダーから動的に解決されていました。したがって、必要な結果を得るには、hostname-strict-backchannel=true
を指定する必要がありました。
hostname v2 の場合、バックチャネル URL はすでにフロントエンド URL と同じです。リクエストヘッダーから動的に解決するには、hostname-backchannel-dynamic=true
を設定し、hostname
オプションに完全な URL を指定する必要があります。
詳細およびより包括的なシナリオについては、ホスト名の設定 (v2) を参照してください。
security-admin-console
クライアントリダイレクト URI
hostname v1 での ${authAdminUrl}
の処理が変更されました。以前の hostname v1 では、hostname-admin
または hostname-admin-url
オプションが設定されていない場合、管理 URL はリクエストから動的に解決されていました。hostname v2 では、管理 URL は代わりにフロントエンド URL にデフォルト設定されます。hostname
オプションが設定され、hostname-strict
が true の場合、この変更により、ルート URL ${authAdminUrl}
を使用するクライアントに対して、代替ホスト名を持つリダイレクト URI が機能しなくなります。単一の代替ホスト名を許可するには、リダイレクト URI の代わりに hostname-admin
オプションを使用することを検討する必要があります。代替ホスト名リダイレクトは、security-admin-console
クライアントはルート URL が ${authAdminUrl}
のデフォルトリダイレクト URI /admin/master/console/*
のみを必要とするため、削除する必要があります。
永続ユーザーセッション
以前のバージョンの Keycloak では、オフラインユーザーセッションとオフラインクライアントセッションのみがデータベースに保存されていました。新機能 persistent-user-sessions
は、オンラインユーザーセッションとオンラインクライアントセッションをメモリだけでなくデータベースにも保存します。これにより、Keycloak のすべてのインスタンスが再起動またはアップグレードされた場合でも、ユーザーはログイン状態を維持できます。
永続ユーザーセッションの有効化
この機能はプレビュー機能であり、デフォルトでは無効になっています。使用するには、ビルドコマンドに以下を追加します。
bin/kc.sh build --features=persistent-user-sessions ...
詳細については、機能の有効化と無効化 ガイドを参照してください。サイジングガイド には、この機能が有効になっている場合の更新されたリソース要件を説明する新しい段落が含まれています。
組み込み Infinispan のみを使用してセッションを格納している既存のデプロイメントでこの機能が有効になっている場合、既存のオンラインユーザーセッションおよびクライアントセッションはデータベースに移行されません。新しく作成されたオンラインユーザーセッションおよびオンラインクライアントセッションにのみ影響します。 |
永続セッションが有効になっている場合、オンラインユーザーセッション、オフラインユーザーセッション、オンラインクライアントセッション、およびオフラインクライアントセッションのインメモリキャッシュは、デフォルトでノードあたり 10000 エントリに制限され、大規模なインストールでの Keycloak の全体的なメモリ使用量が削減されます。メモリから削除されたアイテムは、必要に応じてデータベースからオンデマンドでロードされます。キャッシュのサイズを個別に設定するには、Keycloak のキャッシュ構成ファイルを編集して、これらのキャッシュに <memory max-count="..."/>
を設定します。この機能が有効になると、ログイン、ログアウト、およびリフレッシュトークンリクエストごとにデータベースの使用率が増加することが予想されます。
Keycloak マルチサイトセットアップで外部 Infinispan のキャッシュサイズを構成するには、更新された Infinispan Operator を使用した HA 用 Infinispan のデプロイ ガイドを参照してください。
この機能が有効になっている場合、オプション spi-user-sessions-infinispan-offline-session-cache-entry-lifespan-override
および spi-user-sessions-infinispan-offline-client-session-cache-entry-lifespan-override
は、以前はオフラインセッションをメモリ内に保持する時間をオーバーライドするために使用されていたため、利用できなくなりました。
アップグレード中のユーザーセッションの移行
Keycloak 24 以前からアップグレードする場合、管理者は既存のオンラインユーザーセッションおよびクライアントセッションを永続セッションに移行することを選択できます。これが機能するためには、これらの既存のセッションは、リモート Infinispan または Keycloak の組み込みキャッシュの JDBC 永続性として構成されたデータベースのいずれかに格納されている必要があります。Keycloak 24 のインメモリセッションの移行は、組み込み Infinispan のメジャーバージョンアップグレードのため、アップグレード前にすべての Keycloak インスタンスをシャットダウンする必要があるため、サポートされていません。
ユーザーセッションの移行は、Keycloak 25 にアップグレードするときに永続ユーザーセッションが有効になっている場合にのみ機能します。永続ユーザーセッションを有効にせずに 25 にアップグレードすることを選択した場合、現時点では既存のセッションの移行を後でトリガーする方法はありません。 構成変更によって後でこの機能を有効にすると、永続化されたセッションと非永続化されたセッションが共存する場合、セッションに関連する Keycloak の未定義の動作が発生する可能性があります。これを防ぐために、最初のノードが機能を有効にして起動される前に、既存のすべてのオンラインユーザーセッションおよびクライアントセッションを削除します。これは、すべての Keycloak ノードを停止する必要があることを意味し、使用している場合は、Infinispan リモートキャッシュストアと組み込み Infinispan JDBC 永続性をクリアする必要があります。 |
Keycloak のアップグレード中にユーザーセッションを移行するには、次の手順を実行します。
-
実行中の古い Keycloak インスタンスをすべて停止します。
-
バックアップを作成します。
-
Keycloak のデータベースのバックアップを作成します。
-
JDBC 永続性を使用している場合は、セッションの移行を再試行できるように、そのデータベースのバックアップを作成します。
-
外部 Infinispan を使用している場合は、セッションの移行を再試行できるように、そのデータのバックアップを作成します。
-
-
永続ユーザーセッション機能を有効にして、新しい Keycloak インスタンスを起動します。
最初に起動するノードは、
-
データベースをスキーマバージョン 25 に移行します。
-
リモート Infinispan または Keycloak の組み込みキャッシュ用に構成された JDBC 永続性のいずれかから、すべてのセッション情報を Keycloak のデータベースにコピーします。
データは、
offline_flag
がfalse
に設定されたoffline_user_session
およびoffline_client_session
テーブルに格納されます。 -
キャッシュをクリアします。
これには、外部 Infinispan (使用されている場合) のキャッシュのクリア、および JDBC 永続性 (使用されている場合) のクリアが含まれます。
-
-
キャッシュ
sessions
およびclientSessions
の Keycloak のキャッシュ構成 XML を更新します。-
JDBC 永続性を使用している場合は、JDBC 永続性の構成を削除します。
-
リモート Infinispan がシングルサイトセットアップで Keycloak の再起動間でユーザーセッションを維持するためだけに使用されていた場合は、これらのキャッシュのリモート Infinispan 構成を削除します。
リモート Infinispan がマルチサイトセットアップで使用されている場合は、メモリ内のエントリ数を構成することで、外部 Infinispan によるリソース消費を削減できます。Infinispan Operator を使用した HA 用 Infinispan のデプロイ ガイドで概説されている設定を使用してください。 -
-
新しいキャッシュ構成 XML をアクティブにするための Keycloak のローリング再起動。
組み込みキャッシュのメトリクスがデフォルトで有効になりました
組み込みキャッシュのメトリクスがデフォルトで有効になりました。レイテンシのヒストグラムを有効にするには、オプション cache-metrics-histograms-enabled
を true
に設定します。
HTTP エンドポイントのメトリクスがデフォルトで有効になりました
Keycloak によって提供されるメトリクスには、http_server
で始まる HTTP サーバーメトリクスが含まれるようになりました。いくつかの例を以下に示します。
http_server_active_requests 1.0
http_server_requests_seconds_count{method="GET",outcome="SUCCESS",status="200",uri="/realms/{realm}/protocol/{protocol}/auth"} 1.0
http_server_requests_seconds_sum{method="GET",outcome="SUCCESS",status="200",uri="/realms/{realm}/protocol/{protocol}/auth"} 0.048717142
新しいオプション http-metrics-histograms-enabled
および http-metrics-slos
を使用して、デフォルトのヒストグラムバケットまたはサービスレベル目標 (SLO) の特定のバケットを有効にします。ヒストグラムの使用方法については、Prometheus ドキュメントのヒストグラムに関するドキュメント を参照して、http_server_requests_seconds_bucket
で提供される追加のメトリクスシリーズを使用する方法を確認してください。
Argon2 パスワードハッシュ
Keycloak 24 リリースでは、CPU 使用率の増加につながるパスワードハッシュアルゴリズムの変更がありました。それに対処するために、FIPS 以外の環境では異なるデフォルトのハッシュアルゴリズム Argon2 を選択しました。これにより、CPU 使用率が Keycloak 24 リリース前のレベルに戻ります。
全体的な CPU 使用率の改善と一時的なデータベースアクティビティの増加が予想されます
Keycloak 高可用性ガイドの CPU およびメモリリソースのサイジングの概念が更新され、新しいハッシュのデフォルトが反映されました。
アップグレード後、パスワードベースのログイン中に、ユーザーのパスワードは新しいハッシュアルゴリズムとハッシュイテレーションで 1 回限りのアクティビティとして再ハッシュされ、データベースで更新されます。これにより、Keycloak の内部キャッシュからユーザーがクリアされるため、データベースレベルでの読み取りアクティビティの増加も確認できます。このデータベースアクティビティの増加は、再ハッシュされたユーザーのパスワードが増えるにつれて、時間の経過とともに減少します。
HTTP レスポンスを消費する際のメモリ使用量の制限
ブローカリングなどの一部のシナリオでは、Keycloak は HTTP を使用して外部サーバーと通信します。これらのプロバイダーが過剰なデータを送信した場合のサービス拒否を回避するために、Keycloak はデフォルトでレスポンスを 10 MB に制限するようになりました。
ユーザーは、プロバイダー構成オプション spi-connections-http-client-default-max-consumed-response-size
を設定することで、この制限を構成できます。
bin/kc.[sh|bat] --spi-connections-http-client-default-max-consumed-response-size=1000000
ホスト名検証ポリシー
spi-truststore-file-hostname-verification-policy
および新しい tls-hostname-verifier
オプションのデフォルトは、WILDCARD ではなく DEFAULT になりました。WILDCARD および STRICT オプション値は非推奨になりました。代わりに DEFAULT に依存する必要があります。
WILDCARD でサポートされており、DEFAULT でサポートされていない動作: * サブドメイン名 (例: *.foo.com) のワイルドカードが、複数レベル (例: a.b.foo.com) を含むすべてに一致することを許可します。* 既知のパブリックサフィックスとの一致を許可します - 例: foo.co.gl は *.co.gl と一致する可能性があります。
STRICT でサポートされており、DEFAULT でサポートされていない動作: * STRICT は、ワイルドカードが一致するかどうかを判断する際に、2 文字のトップレベル (*.XXX.YY) で終わる 2 文字または 3 文字のドメイン名の小さな除外リストを使用します。代わりに DEFAULT は、https://publicsuffix.org/list/ からのパブリックサフィックスルールと除外のより完全なリストを使用します。
WILDCARD または STRICT オプションからのこれらの動作に依存することは想定されていません。
期限切れの認証セッションに対する「すでにログインしています」というメッセージに対処
Keycloak は、認証セッションが期限切れになり、ユーザーがすでにログインしている場合、「すでにログインしています」というメッセージをエンドユーザーに表示しなくなりました。代わりに、期限切れの認証セッションに関するエラーをクライアントアプリケーションにリダイレクトするため、クライアントは サーバー管理ガイドの認証セッションの章 で説明されているように、それに対してアクションを実行し、認証を再開できます。アプリケーションを更新してこのエラーを処理できるようにすることを検討してください。
モデルモジュールを削除
モジュール org.keycloak:keycloak-model-legacy
モジュールは以前のリリースで非推奨となり、今回のリリースで削除されました。代わりに org.keycloak:keycloak-model-storage
モジュールを使用してください。
XA トランザクションの変更
-
オプション
transaction-xa-enabled
は、true ではなく false がデフォルトになります。XA トランザクションのサポートが必要な場合は、このオプションを明示的に true に設定する必要があります。 -
XA トランザクションリカバリサポートはデフォルトで有効になっています。トランザクションログは KEYCLOAK_HOME/data/transaction-logs に保存されます。
cache
オプションをランタイムで指定
オプション cache
、cache-stack
、および cache-config-file
は、ビルド時のオプションではなくなり、実行時にのみ指定できます。これにより、これらのオプションのためにビルドフェーズを実行したり、イメージを再構築したりする必要がなくなります。これらのオプションは build
フェーズ中には認識されないため、build
フェーズから削除し、runtime
フェーズに追加する必要があることに注意してください。現在のキャッシュオプションを runtime
フェーズに追加しない場合、Keycloak はデフォルトのキャッシュ設定にフォールバックします。
kcadm および kcreg の変更点
kcadm および kcreg がオプションとパラメータを解析および処理する方法が変更されました。使用方法のエラー、不正なオプションまたはパラメータからのエラーメッセージは、以前のバージョンとは若干異なる場合があります。また、使用方法のエラーの終了コードは 1 ではなく 2 になります。
カスタムユーザー属性インデックスの削除
ユーザー属性でユーザーを検索する際、Keycloak はユーザー属性名を検索する際に小文字比較を強制しなくなりました。これは、ユーザー属性テーブルに対する Keycloak ネイティブインデックスが検索時に使用されるようになることを意味します。検索を高速化するために `lower(name)` に基づいて独自のインデックスを作成している場合は、削除できます。
新しいデフォルトクライアントスコープ basic
basic
という名前の新しいクライアントスコープがレルムの「デフォルト」クライアントスコープとして追加され、したがって、新しく作成されたすべての OIDC クライアントに追加されます。クライアントスコープは、移行中に既存のすべての OIDC クライアントにも自動的に追加されます。
このスコープには、次のクレーム用に事前設定されたプロトコルマッパーが含まれています。
-
sub
(詳細については、専用のセクションを参照してください) -
auth_time
これにより、軽量アクセストークン内のクレーム数を減らすための追加のヘルプが提供されますが、常に自動的に追加されていたクレームを設定する機会も得られます。
レルムのいずれかに basic という名前のクライアントスコープがすでに存在する場合、新しいクライアントスコープ basic はレルムに追加されず、どのクライアントにも追加されません。この特定のケースでは、移行は無視されます。その場合、この Keycloak バージョンに移行する前にクライアントスコープの名前を basic 以外のものに変更するか、トークンに必要な場合に sub および auth_time クレームが欠落している場合に手動で対処する必要があります。また、一部のクライアントスコープに手動で対応するプロトコルマッパーを追加する必要がある場合があります。 |
session_state
クレームの削除
sid
クレームと同じ値を含む session_state
クレームは、OpenID Connect Front-Channel Logout および OpenID Connect Back-Channel Logout 仕様に従って不要になったため、すべてのトークンから削除されました。session_state
クレームは、OpenID Connect Session Management 仕様に従って、アクセストークンレスポンスに残ります。
setSessionState()
メソッドも IDToken
クラスから削除され、setSessionId()
メソッドに置き換えられ、getSessionState()
メソッドは非推奨になったことに注意してください。
新しい Session State (session_state)
マッパーも含まれており、クライアントスコープ (たとえば basic
クライアントスコープ) に割り当てて、古い動作に戻すことができます。
古いバージョンの JS アダプターを使用している場合は、上記のクライアントスコープを使用することにより、Session State (session_state)
マッパーも使用する必要があります。
sub
クレームがプロトコルマッパーを介してアクセストークンに追加される
常にアクセストークンに追加されていた sub
クレームが、デフォルトで追加されるようになりましたが、新しい Subject (sub)
プロトコルマッパーを使用しています。
Subject (sub)
マッパーは、basic
クライアントスコープでデフォルトで設定されています。したがって、このバージョンにアップグレードした後、追加の設定は必要ありません。
アクセストークンの sub
クレームをマッピングするために Pairwise subject identifier
マッパーを使用している場合は、Subject (sub)
マッパーを無効にするか削除することを検討できます。ただし、Subject (sub)
プロトコルマッパーが Pairwise subject identifier
マッパーの前に実行されるため、厳密には必要ありません。したがって、pairwise
値は Subject (sub)
マッパーによって追加された値をオーバーライドします。これは、sub
クレームをオーバーライドする他のカスタムプロトコルマッパーの実装にも適用される可能性があります。Subject (sub)
マッパーは現在、最初のプロトコルマッパーとして実行されるためです。
Subject (sub)
マッパーを使用して、アクセストークン、軽量アクセストークン、およびイントロスペクションレスポンスに対してのみ sub
クレームを設定できます。IDToken および Userinfo には常に sub
クレームが含まれています。
マッパーはサービスアカウントには影響しません。ユーザーセッションが存在せず、sub
クレームは常にアクセストークンに追加されるためです。
Nonce クレームは ID トークンにのみ追加される
nonce クレームは、OpenID Connect Core 1.0 仕様に厳密に従って、ID トークンにのみ追加されるようになりました。仕様で示されているように、クレームは、同じパラメータが認証リクエストで送信された場合、ID トークン内で必須です。仕様では、リフレッシュリクエスト後に nonce
を追加しないことも推奨しています。以前は、クレームはすべてのレスポンス (リフレッシュを含む) のすべてのトークン (アクセス、リフレッシュ、ID) に設定されていました。
新しい Nonce backwards compatible
マッパーもソフトウェアに含まれており、クライアントスコープに割り当てて古い動作に戻すことができます。たとえば、JS アダプターは、バージョン 24.0.0 の #26651 の問題を修正する前に、すべてのトークンで返された nonce
クレームを確認していました。したがって、古いバージョンの JS アダプターを使用している場合は、クライアントスコープを使用して、必要なクライアントにマッパーを追加する必要があります。
リフレッシュトークンに関連するイベントの userId
の変更
REFRESH_TOKEN
イベントの userId
は、リフレッシュトークンの sub
クレームからではなく、ユーザーセッションから常に取得されるようになりました。REFRESH_TOKEN_ERROR
イベントの userId
は、常に null になりました。この変更の理由は、リフレッシュトークンの sub
クレームの値が、オプションの sub
クレームの導入により null になる可能性があるか、ペアワイズサブジェクト識別子または sub
クレームをオーバーライドする他の方法を使用している場合に、実際のユーザー ID と異なる可能性があるためです。
ただし、refresh_token_sub
の詳細は、REFRESH_TOKEN_ERROR
イベントで userId が欠落している場合にユーザーに関する情報を持つための下位互換性として追加されました。
古い JavaScript アダプターの使用
最新の Keycloak サーバーをアプリケーションで古いバージョンの JavaScript アダプターで使用する場合、以前のバージョンの JavaScript アダプターが Keycloak によって追加されたが、OIDC 仕様ではサポートされていないクレームに依存しているため、上記のトークンの変更の影響を受ける可能性があります。これには以下が含まれます。
-
Keycloak Javascript adapter 24.0.3 以前を使用している場合は、
Session State (session_state)
マッパーを追加する -
Keycloak 24 より古い Keycloak Javascript adapter を使用している場合は、
Nonce backwards compatible
マッパーを追加する
プロトコルマッパーを、対応するクライアントに直接追加するか、古いバージョンの Keycloak Javascript adapter に依存するクライアントアプリケーションで使用できるクライアントスコープに追加できます。session_state
および nonce
クレーム専用の前のセクションで詳細を確認できます。
デフォルトの http-pool-max-threads
の削減
http-pool-max-threads
が設定されていない場合、デフォルトは 50 または 4 x (利用可能なプロセッサ数) の大きい方になります。以前は、デフォルトは 200 または 8 x (利用可能なプロセッサ数) の大きい方でした。ほとんどのユースケースでタスクスレッドの数を減らすと、アクティブなスレッド間のコンテキストスイッチが少なくなるため、パフォーマンスがわずかに向上します。
メトリクスおよびヘルスエンドポイント用の管理ポート
/health
および /metrics
エンドポイントは、デフォルトでオンになっている管理ポート 9000
でアクセスできます。つまり、これらのエンドポイントは、標準の Keycloak ポート 8080
および 8443
に公開されなくなりました。
古い動作を反映するには、プロパティ --legacy-observability-interface=true
を使用します。これにより、これらのエンドポイントは管理ポートに公開されなくなります。ただし、このプロパティは非推奨であり、将来のリリースで削除される予定であるため、使用しないことをお勧めします。
管理インターフェースは、デフォルトの Keycloak HTTP サーバーとは異なる HTTP サーバーを使用し、個別に構成できます。管理インターフェースプロパティに値が指定されていない場合、デフォルトの Keycloak HTTP サーバーから継承されることに注意してください。
詳細については、管理インターフェースの構成を参照してください。
グループパスのスラッシュのエスケープ
Keycloak は、グループパスのスラッシュをエスケープしたことがありません。そのため、top
の子である group/slash
という名前のグループは、完全パス /top/group/slash
を使用しますが、これは明らかに誤解を招く可能性があります。このバージョン以降、サーバーは名前のスラッシュのエスケープを実行するために起動できます。
bin/kc.[sh|bat] start --spi-group-jpa-escape-slashes-in-group-path=true
エスケープ文字はチルダ文字 ~
です。前の例では、パス /top/group~/slash
になります。エスケープは、最後スラッシュが名前の一部であり、階層区切り文字ではないことを示します。
エスケープは現在デフォルトで無効になっています。これは動作の変更を表すためです。それにもかかわらず、エスケープを有効にすることをお勧めします。将来のバージョンではデフォルトになる可能性があります。
クラス EnvironmentDependentProviderFactory
の変更
メソッド EnvironmentDependentProviderFactory.isSupported()
は、いくつかのリリースで非推奨になり、現在削除されました。
代わりに、isSupported(Config.Scope config)
を実装します。
非推奨の LinkedIn プロバイダーの削除
バージョン 22.0.2 で、LinkedIn の OAuh 2.0 ソーシャルプロバイダーは、新しい OpenId Connect 実装に置き換えられました。レガシープロバイダーは非推奨になりましたが、一部の既存のレルムでまだ機能している場合に備えて、削除はされませんでした。Keycloak 25.0.0 では、古いプロバイダーとその関連する linkedin-oauth
機能が明確に削除されます。今後は、デフォルトの LinkedIn
ソーシャルプロバイダーが唯一の利用可能なオプションになります。
findGrantedResources
および findGrantedOwnerResources
クエリのパフォーマンスの向上
これらのクエリは、RESOURCE_SERVER_RESOURCE
および RESOURCE_SERVER_PERM_TICKET
テーブルに 10 万を超えるエントリがあり、ユーザーが 1 千を超えるリソースへのアクセスを許可されている場合、パフォーマンスが低下しました。クエリが簡略化され、requester
および owner
列の新しいインデックスが導入されました。
新しいインデックスは両方とも RESOURCE_SERVER_PERM_TICKET
テーブルに適用されます。テーブルに現在 300,000 を超えるエントリが含まれている場合、Keycloak は自動スキーマ移行中にデフォルトでインデックスの作成をスキップし、代わりに移行中にコンソールに SQL ステートメントをログに記録します。この場合、ステートメントは Keycloak の起動後に DB で手動で実行する必要があります。
異なる制限を構成する方法の詳細については、アップグレードガイドを参照してください。
AccessToken
、IDToken
、および JsonWebToken
クラスから非推奨のメソッドを削除
次のメソッドが AccessToken
クラスから削除されました。
-
expiration
。代わりにexp
メソッドを使用してください。 -
notBefore
。代わりにnbf
メソッドを使用してください。 -
issuedAt
。代わりにiat
メソッドを使用してください。
次のメソッドが IDToken
クラスから削除されました。
-
getAuthTime
およびsetAuthTime
。それぞれgetAuth_time
およびsetAuth_time
メソッドを使用してください。 -
notBefore
。代わりにnbf
メソッドを使用してください。 -
issuedAt
。代わりにiat
メソッドを使用してください。 -
setSessionState
。代わりにsetSessionId
メソッドを使用してください (session_state
クレームに関するセクションで詳細を参照してください)。
次のメソッドが JsonWebToken
クラスから削除されました。
-
expiration
。代わりにexp
メソッドを使用してください。 -
notBefore
。代わりにnbf
メソッドを使用してください。 -
issuedAt
。代わりにiat
メソッドを使用してください。
exp
および nbf
クレームはオプションであるため、トークンに設定されていないことも想定する必要があります。以前は、これらのクレームは 0
の値で設定されていましたが、その値は有効な NumericDate
である必要があるため、意味がありません。
メソッド getExp
が SingleUseObjectKeyModel
に追加
AccessToken
、IDToken
、および JsonWebToken
から非推奨のメソッドが削除された結果、SingleUseObjectKeyModel
も有効期限値に関連するメソッド名を一貫性を保つために変更されました。
以前の getExpiration
メソッドは非推奨になり、2038 年以降のオーバーフローを避けるために、新しく導入された getExp
メソッドを使用することをお勧めします。
PasswordHashProvider
で非推奨になったメソッド encode
インターフェース org.keycloak.credential.hash.PasswordHashProvider
のメソッド String encode(String rawPassword, int iterations)
は非推奨になりました。このメソッドは、今後の Keycloak リリースのいずれかで削除されます。Keycloak 27 リリースになる可能性があります。
CollectionUtil intersection メソッドの削除
メソッド org.keycloak.common.util.CollectionUtil.intersection
が削除されました。既存のコレクションで代わりに 'java.util.Collection.retainAll' を使用する必要があります。
Resteasy util クラスは非推奨
org.keycloak.common.util.Resteasy
は非推奨になりました。代わりに org.keycloak.util.KeycloakSessionUtil
を使用して KeycloakSession
を取得する必要があります。
カスタムプロバイダーを作成する場合以外は、他の手段で KeycloakSession
を取得することは強くお勧めしません。
セッションの寿命とアイドル計算の小さな変更
以前のバージョンでは、セッションがまだ有効かどうかを検証する際に、セッションの最大寿命とアイドルタイムアウトの計算がわずかに異なっていました。現在では、その検証はプロジェクトの残りの部分と同じコードを使用しています。
セッションが Remember Me 機能を使用している場合、アイドルタイムアウトと最大寿命は、共通 SSO と Remember Me 構成値の最大値になります。
外部 Infinispan の要件
Keycloak では、外部 Infinispan デプロイメントの場合、少なくとも 15.0.0 の Infinispan サーバーバージョンが必須になりました。外部 Infinispan デプロイメントは、HA ガイドで概説されているマルチサイトセットアップでサポートされています。
Oracle Database ドライバーはディストリビューションに含まれていません
Oracle Database JDBC ドライバーは、Keycloak ディストリビューションに含まれなくなりました。Oracle DB を使用する場合は、特定の環境と互換性のあるバージョンの Oracle Driver を手動でインストールする必要があります。このプロセスの手順については、データベースの構成ガイドを参照してください。
非推奨のテーマ変数
次の変数は、管理テーマで非推奨になり、将来のバージョンで削除されます。
-
authServerUrl
。代わりにserverBaseUrl
を使用してください。 -
authUrl
。代わりにadminBaseUrl
を使用してください。
次の変数は、アカウントテーマで非推奨になり、将来のバージョンで削除されます。
-
authServerUrl
。代わりにserverBaseUrl
を使用してください。serverBaseUrl
には末尾のスラッシュが含まれていないことに注意してください。 -
authUrl
。代わりにserverBaseUrl
を使用してください。serverBaseUrl
には末尾のスラッシュが含まれていないことに注意してください。
クライアントセッションで現在のリフレッシュトークンを取得および設定するメソッドが非推奨になりました
インターフェース org.keycloak.models.AuthenticatedClientSessionModel
のメソッド String getCurrentRefreshToken()
、void setCurrentRefreshToken(String currentRefreshToken)
、int getCurrentRefreshTokenUseCount()
、および void setCurrentRefreshTokenUseCount(int currentRefreshTokenUseCount)
は非推奨になりました。これらは、クライアントセッション内で複数のリフレッシュトークンを管理するために、getRefreshToken(String reuseId)
などのパラメータとして識別子を必要とする同様のメソッドに置き換えられました。これらのメソッドは、今後の Keycloak リリースのいずれかで削除されます。Keycloak 27 リリースになる可能性があります。
24.0.4 への移行
管理者ユーザー API を介してユーザーを更新する際のユーザー属性への部分的な更新は、サポートされなくなりました
管理者ユーザー API を介してユーザー属性を更新する場合、username
、email
、firstName
、および lastName
などのルート属性を含め、ユーザー属性を更新する際に部分的な更新を実行することはできません。
管理者が書き込み権限を持つすべての属性を渡さずに管理者ユーザー API を介してユーザー属性を更新する場合、欠落している属性は削除されます。一方、属性が管理者に対して読み取り専用としてマークされている場合、属性を送信しなくても削除されません。
ユーザープロファイル設定の詳細については、ユーザープロファイルドキュメントを参照してください。
24.0.3 への移行
org.keycloak.userprofile.UserProfileDecorator
インターフェースの変更
レルム内の複数のユーザー ストレージ プロバイダーを適切にサポートするために、org.keycloak.userprofile.UserProfileDecorator
インターフェースが変更されました。
decorateUserProfile
メソッドは、ユーザープロファイル構成を初めて解析 (およびキャッシュ) するときには呼び出されなくなりましたが、ユーザーがユーザープロファイルプロバイダーを介して管理されるたびに呼び出されるようになりました。その結果、メソッドのコントラクトが次のように変更されました。
List<AttributeMetadata> decorateUserProfile(String providerId, UserProfileMetadata metadata)
以前のコントラクトおよび動作とは異なり、このメソッドは、ユーザーがロードされたユーザー ストレージ プロバイダーに対してのみ呼び出されます。
ワイルドカード使用時のリダイレクト URI 検証の変更
セキュリティ上の懸念から、リダイレクト URI 検証は、渡されたリダイレクト URI に userinfo
部分が含まれているか、その path
が親ディレクトリ (/../
) にアクセスする場合、正確な文字列マッチング (ワイルドカードは含まない) を実行するようになりました。
完全なワイルドカード *
は、これらの特性を持つ http(s) URI の開発では、引き続き有効なリダイレクトとして使用できます。実稼働環境では、ワイルドカードなしの正確な有効なリダイレクト URI を、そのタイプの URI 用に構成する必要があります。
ワイルドカードの有効なリダイレクト URI は、実稼働環境では推奨されておらず、OAuth 2.0 仕様ではカバーされていないことに注意してください。
24.0.0 への移行
Welcome テーマの変更
'welcome' テーマは、新しいレイアウトを使用するように更新され、PatternFly 3 ではなく PatternFly 5 を使用するようになりました。テーマを拡張している場合、または独自のテーマを提供している場合は、次のように更新する必要がある場合があります。
PatternFly 3 から PatternFly 5 への移行
welcome テーマは、Keycloak で最も古いテーマの 1 つでした。元々は PatternFly 3 に基づいていましたが、現在は PatternFly 5 を使用するように更新され、その過程でメジャーバージョンをスキップしました。カスタムテーマが組み込みテーマを拡張している場合は、PatternFly 5 構文を使用するように更新する必要があります。詳細については、PatternFly 5 ドキュメントを参照してください。
独自のカスタムテーマ (組み込みテーマを拡張していない) で PatternFly 3 を引き続き使用している場合は、引き続き使用できますが、PatternFly 3 のサポートは将来のリリースで削除される予定であるため、できるだけ早く PatternFly 5 に移行することを検討する必要があります。
管理コンソールへの自動リダイレクト
管理コンソールが有効になっている場合、管理ユーザーがすでに存在する場合、ウェルカムページは自動的に管理コンソールにリダイレクトされます。この動作は、theme.properties
ファイルで redirectToAdmin
を設定することで変更できます。デフォルトでは、プロパティは false
に設定されています。ただし、組み込みテーマを拡張している場合は、プロパティは true
に設定されています。
アカウントコンソールテーマのカスタマイズの変更
非推奨になったバージョン 2 のアカウントコンソールテーマを以前に拡張していた場合は、新しいバージョン 3 のアカウントコンソールテーマを使用するようにテーマを更新する必要があります。新しいバージョンのアカウントコンソールテーマには、カスタマイズ方法に関していくつかの変更が加えられています。クリーンな状態から始めるには、新しい カスタマイズクイックスタートに従うことができます。
カスタムテーマを移動するには、最初に parent
を新しいテーマに変更します。
# Before
parent=keycloak.v2
# After
parent=keycloak.v3
カスタム React コンポーネントがある場合は、相対パスを使用するのではなく、React を直接インポートします。
// Before
import * as React from "../../../../common/keycloak/web_modules/react.js";
// After
import React from "react";
content.json
を使用してテーマをカスタマイズしている場合、ファイルの構造にいくつかの変更があります。具体的には、
-
content
プロパティの名前がchildren
に変更されました。 -
id
、icon
、およびcomponentName
プロパティは、modulePath
が同じ機能を提供するため、削除されました。
Keycloak JS のインポートを更新する必要がある場合があります
Keycloak JS を Keycloak サーバーから直接ロードしている場合、このセクションは安全に無視できます。Keycloak JS を NPM パッケージからロードし、Webpack、Vite などのバンドラーを使用している場合は、コードにいくつかの変更を加える必要がある場合があります。Keycloak JS パッケージは、package.json ファイルで exports
フィールドを使用するようになりました。これは、インポートを変更する必要があるかもしれないことを意味します。
// Before
import Keycloak from 'keycloak-js/dist/keycloak.js';
import AuthZ from 'keycloak-js/dist/keycloak-authz.js';
// After
import Keycloak from 'keycloak-js';
import AuthZ from 'keycloak-js/authz';
機能の変更
--features
と --features-disabled
の両方のリストに同じ機能を含めることはできなくなりました。機能は 1 つのリストにのみ表示される必要があります。
--features
リストで docker
などのバージョン管理されていない機能名を使用すると、最もサポートされている/最新の機能バージョンを有効にできます。リリース間でより予測可能な動作が必要な場合は、代わりに docker:v1
など、必要な特定のバージョンを参照してください。
ユーザープロファイルの変更
ユーザープロファイルがデフォルトで有効になる
ユーザープロファイル機能がデフォルトで有効になりました。ユーザープロファイルが有効になっていると想定されるため、`declarative-user-profile` 機能は使用できなくなりました。したがって、[レルム設定] から [ユーザープロファイルが有効] スイッチが削除され、[管理対象外の属性] に置き換えられました。以前のバージョンから移行する場合、動作は次のようになります。
-
[ユーザープロファイルが有効] が [オン] に設定されていたデプロイメントの場合、アップグレード後に [管理対象外の属性] が [オフ] に設定されます。その結果、ユーザープロファイルで明示的にサポートされているユーザー属性のみが許可されます。
-
ユーザープロファイル有効 が OFF に設定されているデプロイメント(
declarative-user-profile
機能が無効になっているデプロイメントのデフォルト設定でもありました。これもデフォルトでした)の場合、アップグレード後、管理外属性 は ON に設定されます。その結果、動作は基本的にユーザープロファイルが無効になっている以前のバージョンと同じになるはずです。属性 タブは、管理コンソールのユーザー詳細部分に残ります。また、特定のカスタムテーマがサポートしていれば、ユーザーは登録ページやプロファイル更新ページなどのUIページを通じて任意の属性を設定できるようになりました。カスタムテーマもこれまでどおり動作するはずです。ただし、ユーザープロファイルを使用するようにテーマを更新し、カスタム属性を追加するために必要だった場合は、カスタムテーマを削除することも検討してください。テーマに関する後続のセクションを参照してください。また、管理外属性 を OFF に切り替えるか、管理者のみがこのスイッチを有効にすることを検討して、主に管理属性の使用に頼ることができるようにしてください。
管理外属性 の詳細については、ユーザープロファイルドキュメントを参照してください。
デフォルトのバリデーション
デフォルトのユーザープロファイル設定には、基本的な事前定義フィールドに対する一連のデフォルトバリデーションが付属しています。これらのバリデーションは、declarative-user-profile
機能がデフォルトで無効になっていた以前のバージョンには存在しませんでした。後方互換性の問題が発生した場合は、必要に応じてデフォルトのバリデーターを変更できます。デフォルトのバリデーターは次のとおりです
-
`username`、
email
、firstName
、およびlastName
属性の最大長は 255 文字です。これらのバリデーションは、以前のバージョンにも間接的に存在していました。これは、これらのフィールドの最大長が 255 文字であるテーブルUSER_ENTITY
のデータベース制約によるものです。ただし、ユーザー ストレージ プロバイダーを使用する場合、以前はより長い値を使用できた可能性があります。 -
username
属性の最小長は 3 文字です。ユーザー名には、デフォルトでusername-prohibited-characters
およびup-username-not-idn-homograph
バリデーターもあります。これらは以前のバージョンには存在しませんでした。これらの属性の詳細については、ユーザープロファイルドキュメントのバリデーションセクションを参照してください。レルムスイッチEdit username enabled
を有効にしない限り、ユーザー名はデフォルトで編集できないことに注意してください。この変更は、ユーザー名が正しくない既存のユーザーは引き続き動作し、ユーザー名を更新する必要がないことを意味します。ただし、新規ユーザーは、登録中または管理者 REST API による作成中に正しいユーザー名を使用する必要があります。 -
firstName
およびlastName
属性には、person-name-prohibited-characters
バリデーターが設定されています。これらは以前のバージョンには存在しませんでした。これらの属性の詳細については、ユーザープロファイルドキュメントのバリデーションセクションを参照してください。名と姓はどちらもデフォルトで編集可能であるため、以前のバージョンからそのような不正な名/姓を持っているユーザーは、ユーザープロファイルを更新するときにそれらを更新する必要があります。
奇妙な文字を含むユーザー属性名
以前のバージョンでは、some:attribute
や some/attribute
などの属性名を持つユーザーを作成できました。ユーザープロファイルは、意図的にユーザープロファイル設定でこのような奇妙な名前を持つ属性の作成を許可していません。そのため、レルムの 管理外属性
を設定し、管理者(理想的には)またはエンドユーザー(本当に必要な場合)の管理外属性を有効にする必要がある場合があります。ただし、そのような属性名の使用は強く推奨されません。
デフォルトで有効になっているプロファイル検証必須アクション
新規レルムでは、verify-profile
必須アクションがデフォルトで有効になっています。ただし、以前のバージョンから移行する場合、既存のレルムでは、この verify-profile
アクションの状態は以前と同じになります。通常、以前のバージョンではデフォルトで無効になっていたため、無効になっていることを意味します。この必須アクションの詳細については、ユーザープロファイルドキュメントを参照してください。
ユーザープロファイル SPI の破壊的な変更
拡張機能でユーザープロファイル SPI を使用している場合は、このリリースで導入された API の変更の影響を受ける可能性があります。
org.keycloak.userprofile.Attributes
インターフェースには、次の変更が含まれています。
-
メソッド
getValues
は、通常の JavaMap
からの同じ操作とより一致するようにget
に名前が変更されました。 -
メソッド
isRootAttribute
は、ユーティリティクラスorg.keycloak.userprofile.UserProfileUtil.isRootAttribute
に移動されました。 -
メソッド
getFirstValue
は、冗長性を減らすためにgetFirst
に名前が変更されました。 -
メソッド
getReadable(boolean)
は削除され、読み取り権限がある場合は常にすべてのアトリビュート(ルートアトリビュートを含む)が返されるようになりました。
ユーザープロファイルとレルムに基づいてページをレンダリングするための Freemarker テンプレートの変更
このリリースでは、レルムに設定されたユーザープロファイル構成に基づいて属性を動的にレンダリングできるようにするために、次のテンプレートが更新されました。
-
login-update-profile.ftl
-
register.ftl
-
update-email.ftl
これらのテンプレートは、それぞれプロファイル更新(ユーザーに対して プロファイル更新 必須アクションが有効になっている場合)、登録、およびメール更新(UPDATE_EMAIL 機能が有効になっている場合)ページをレンダリングします。
カスタムテーマを使用してこれらのテンプレートを変更した場合、コンテンツのみが更新されるため、期待どおりに機能します。ただし、{宣言型ユーザープロファイル} を構成する方法を確認し、この機能によって提供されるすべての機能を使用して、組み込みテンプレートの変更を回避することを推奨します。
また、declarative-user-profile
機能が同じフローのページをレンダリングするために使用していたテンプレートは不要になり、このリリースで削除されました。
-
update-user-profile.ftl
-
register-user-profile.ftl
以前のリリースで declarative-user-profile
機能を上記のテンプレートのカスタマイズとともに使用していた場合は、login-update-profile.ftl
と register.ftl
を適宜更新してください。
ブローカー経由での初回ログイン時のプロファイル更新ページ用の新しい Freemarker テンプレート
このリリースでは、ユーザーがブローカー経由で初めて認証するときに、サーバーは idp-review-user-profile.ftl
テンプレートを使用してプロファイル更新ページをレンダリングします。
以前のリリースでは、最初のブローカーログインフロー中にプロファイルを更新するために使用されていたテンプレートは login-update-profile.ftl
であり、これはユーザーがレルムに対して認証するときにプロファイルを更新するために使用されるテンプレートと同じでした。
フローごとに別々のテンプレートを使用することで、同じテンプレートを共有するのではなく、テンプレートが実際にどのフローに使用されているかをより明確に区別でき、特定のフローのページにのみ影響を与えるはずの予期しない変更や動作が導入される可能性を減らすことができます。
ブローカー経由で認証するときにユーザーがプロファイルを更新する方法をカスタマイズするために login-update-profile.ftl
テンプレートをカスタマイズしている場合は、変更を新しいテンプレートに移動してください。
トラストストアの変更
spi-truststore-file-*
オプションとトラストストア関連のオプション https-trust-store-*
は非推奨になりました。したがって、トラストストアマテリアルの新しいデフォルトの場所である conf/truststores
を使用するか、truststore-paths
オプションを使用して目的のパスを指定してください。詳細については、関連する ガイド を参照してください。
tls-hostname-verifier
プロパティは、spi-truststore-file-hostname-verification-policy
プロパティの代わりに使用する必要があります。
変更の付随的な影響として、トラストストアプロバイダーは常にいくつかの証明書で構成されるようになりました(少なくともデフォルトの Java 信頼済み証明書が存在します)。この新しい動作は、Keycloak の他の部分に影響を与える可能性があります。
たとえば、webauthn 登録は、attestation conveyance が Direct バリデーションに構成されている場合に失敗する可能性があります。以前は、トラストストアプロバイダーが構成されていない場合、受信証明書は検証されませんでした。しかし、現在は常にこの検証が実行されます。ドングルから送信された証明書チェーンが Keycloak によって信頼されていないため、登録は invalid cert path
エラーで失敗します。認証器の認証局は、attestation を正しく実行するためにトラストストアプロバイダーに存在する必要があります。
非推奨の --proxy
オプション
--proxy
オプションは非推奨となり、将来のリリースで削除される予定です。次の表は、非推奨のオプションがサポートされているオプションにどのようにマッピングされるかを示しています。
非推奨の使用法 | 新しい使用法 |
---|---|
|
|
|
|
|
|
|
|
|
|
セキュリティ強化のため、--proxy-headers オプションでは、forwarded 値と xforwarded 値の両方を同時に選択することはできません (以前の --proxy edge および --proxy reencrypt の場合と同様)。 |
プロキシヘッダーオプションを使用する場合は、リバースプロキシが Forwarded ヘッダーまたは X-Forwarded-* ヘッダーをそれぞれ正しく設定および上書きしていることを確認してください。これらのヘッダーを設定するには、リバースプロキシのドキュメントを参照してください。構成を誤ると、Keycloak がセキュリティ脆弱性にさらされる可能性があります。 |
Operator を使用する場合もプロキシヘッダーを設定できます
apiVersion: k8s.keycloak.org/v2alpha1
kind: Keycloak
metadata:
name: example-kc
spec:
...
proxy:
headers: forwarded|xforwarded
proxy.headers フィールドが指定されていない場合、Operator はデフォルトで暗黙的に proxy=passthrough を設定することにより、以前の動作にフォールバックします。これにより、サーバーログに非推奨の警告が表示されます。このフォールバックは将来のリリースで削除される予定です。 |
Admin API とアカウントコンテキストの両方でのユーザー表現の変更
org.keycloak.representations.idm.UserRepresentation
と org.keycloak.representations.account.UserRepresentation
の両方の表現クラスが変更され、ルートユーザー属性(username
、email
、firstName
、lastName
、locale
など)は、Admin および Account API に表現ペイロードをフェッチまたは送信するときに一貫した表現を持つようになりました。
username
、email
、firstName
、lastName
、および locale
属性は、新しい org.keycloak.representations.idm.AbstractUserRepresentation
基本クラスに移動されました。
また、getAttributes
メソッドは主にカスタム属性のみを表すことを目的としているため、このメソッドによって返されるマップでルート属性を期待しないでください。このメソッドは、主に特定のユーザーのカスタム属性を更新またはフェッチするときにクライアントを対象としています。
ルート属性を含むすべての属性を解決するために、新しい getRawAttributes
メソッドが追加され、結果のマップにはルート属性も含まれるようになりました。ただし、このメソッドは表現ペイロードからは利用できず、ユーザープロファイルを管理するときにサーバーで使用することを目的としています。
https-client-auth
はビルド時のオプションです
オプション https-client-auth
は実行時オプションとして扱われていましたが、これは Quarkus ではサポートされていません。オプションは代わりにビルド時に処理する必要があります。
オフラインセッションとリモートセッションの順次ロード
このリリース以降、Keycloak クラスターの最初のメンバーは、リモートセッションを並行ではなく順次ロードします。オフラインセッションのプリロードが有効になっている場合、それらも順次ロードされます。
以前のコードは、起動時にクラスター全体で高いリソース消費につながり、本番環境での分析が困難であり、ノードがロード中に再起動された場合に複雑な障害シナリオにつながる可能性がありました。したがって、順次セッションロードに変更されました。
オフラインセッションの場合、Keycloak のこのバージョンと以前のバージョンでのデフォルトは、オンデマンドでセッションをロードすることです。これは、多くのオフラインセッションがある場合に、それらを並行してプリロードしようとするよりも適切にスケールします。このデフォルト設定を使用するセットアップは、オフラインセッションのロード戦略の変更の影響を受けません。オフラインセッションのプリロードが有効になっているセットアップは、オフラインセッションのプリロードが無効になっているセットアップに移行する必要があります。
非推奨のオフラインセッションプリロード
Keycloak のデフォルトの動作は、オフラインセッションをオンデマンドでロードすることです。起動時にそれらをプリロードする古い動作は非推奨になりました。これは、起動時にプリロードすると、セッション数の増加に伴って適切にスケールせず、Keycloak のメモリ使用量が増加するためです。古い動作は将来のリリースで削除される予定です。
非推奨であり、まだ削除されていない古い動作を再度有効にするには、次に示すようにフィーチャーフラグと SPI オプションを使用します。
bin/kc.[sh|bat] start --features-enabled offline-session-preloading --spi-user-sessions-infinispan-preload-offline-sessions-from-database=true
UserSessionProvider
の API は、メソッド getOfflineUserSessionByBrokerSessionId(RealmModel realm, String brokerSessionId)
を非推奨にしました。このメソッドの代わりに、getOfflineUserSessionByBrokerUserIdStream(RealmModel, String brokerUserId)
を使用して、最初にユーザーのセッションを取得し、必要に応じてブローカーセッション ID でフィルタリングします。
Infinispan メトリクスは、キャッシュマネージャーとキャッシュ名にラベルを使用します
Keycloak の組み込みキャッシュのメトリクスを有効にすると、メトリクスはキャッシュマネージャーとキャッシュ名にラベルを使用するようになりました。
vendor_cache_manager_keycloak_cache_sessions_statistics_approximate_entries_in_memory{cache="sessions",node="..."}
vendor_statistics_approximate_entries_in_memory{cache="sessions",cache_manager="keycloak",node="..."}
インストールで変更を元に戻すには、カスタム Infinispan XML 構成を使用し、次のように構成を変更します。
<metrics names-as-tags="false" />
ユーザー属性値の長さの拡張
このリリース以降、Keycloak は以前は制限されていた 255 文字を超えるユーザー属性値の保存と検索をサポートします。
ユーザーが属性を更新できるセットアップ(アカウントコンソール経由など)では、バリデーションを追加してサービス拒否攻撃を防ぎます。管理外属性が許可されておらず、すべての編集可能な属性に入力長を制限するバリデーションがあることを確認してください。
管理外属性の場合、最大長は 2048 文字です。管理属性の場合、デフォルトの最大長は 2048 文字です。管理者は、タイプ length
のバリデーターを追加することでこれを変更できます。
Keycloak は、ユーザー関連オブジェクトを内部キャッシュにキャッシュします。長い属性を使用すると、キャッシュによって消費されるメモリが増加します。したがって、長さ属性のサイズを制限することを推奨します。大きなオブジェクトは Keycloak の外部に保存し、ID または URL で参照することを検討してください。 |
この変更により、テーブル USER_ATTRIBUTE
および FED_USER_ATTRIBUTE
に新しいインデックスが追加されます。これらのテーブルに 300000 を超えるエントリが含まれている場合、Keycloak は自動スキーマ移行中にデフォルトでインデックス作成をスキップし、代わりに移行中にコンソールに SQL ステートメントをログ出力して、Keycloak の起動後に手動で適用できるようにします。異なる制限を構成する方法の詳細については、アップグレードガイド を参照してください。
新しく追加されたインデックス USER_ATTR_LONG_VALUES_LOWER_CASE および FED_USER_ATTR_LONG_VALUES_LOWER_CASE は、データベースが互換モードで実行されている場合、Oracle によって設定された最大制限である 30 文字を超える場合があります。Oracle バージョン 12.2 以降、より長いインデックス名がサポートされています。 |
LDAP の追加の移行手順
これは、次のすべての基準に一致するインストール用です
-
LDAP ディレクトリのユーザー属性が 2048 文字より大きいか、1500 バイトより大きいバイナリ属性です。
-
属性は、管理者またはユーザーによって、管理コンソール、API、またはアカウントコンソールを介して変更されます。
UI および REST API 経由でこれらの属性を変更できるようにするには、次の手順を実行します。
-
上記で特定された属性をレルムのユーザープロファイルで管理属性として宣言します。
-
前の手順で追加された各属性に
length
バリデーターを定義し、属性値の目的の最小長と最大長を指定します。バイナリ値の場合、Keycloak のバイナリ値の内部 base64 エンコードのオーバーヘッドを考慮して、予想されるバイナリ長に 33% を加算します。
カスタムユーザー ストレージ プロバイダーの追加の移行手順
これは、次のすべての基準に一致するインストール用です
-
Keycloak のデータベースとして MariaDB または MySQL を実行しています。
-
VALUE
列に 2048 文字を超えるコンテンツを含むテーブルFED_USER_ATTRIBUTE
のエントリ。このテーブルは、フェデレーションが有効になっているカスタムユーザープロバイダーに使用されます。 -
長い属性は、管理者またはユーザーによって、管理コンソールまたはアカウントコンソールを介して変更されます。
UI および REST API 経由でこれらの属性を変更できるようにするには、次の手順を実行します。
-
上記で特定された属性をレルムのユーザープロファイルで管理属性として宣言します。
-
前の手順で追加された各属性に
length
バリデーターを定義し、属性値の目的の最小長と最大長を指定します。
Admin send-verify-email API が同じメール検証テンプレートを使用するようになりました
PUT /admin/realms/{realm-name}/users/{id}/send-verify-email
このリリースでは、API は executeActions.ftl
の代わりに email-verification.ftl
テンプレートを使用します。
Perform the following action(s): Verify Email
Confirm validity of e-mail address email@example.org.
この API を使用してユーザーがメールを検証する方法を変更するために executeActions.ftl
テンプレートをカスタマイズした場合は、変更を新しいテンプレートに転送してください。
新しいパラメータ lifespan
が導入され、デフォルトの有効期間値(12 時間)を上書きできるようになります。
以前の動作を優先する場合は、次のように execute-actions-email
API を使用します。
PUT /admin/realms/{realm-name}/users/{id}/execute-actions-email ["VERIFY_EMAIL"]
非推奨の SAML 暗号化モードの削除
バージョン 21 で導入された SAML 暗号化の互換モードは削除されました。システムプロパティ keycloak.saml.deprecated.encryption
はサーバーによって管理されなくなりました。暗号化に古い署名キーをまだ使用していたクライアントは、新しい IDP 構成メタデータからそれを更新する必要があります。
パスワードハッシュの変更
このリリースでは、パスワードストレージに関する OWASP 推奨事項 に一致するように、パスワードハッシュのデフォルトを調整しました。
この変更の一環として、デフォルトのパスワードハッシュプロバイダーが pbkdf2-sha256
から pbkdf2-sha512
に変更されました。また、pbkdf2
ベースのパスワードハッシュアルゴリズムのデフォルトのハッシュ反復回数が次のように変更されました。
プロバイダー ID | アルゴリズム | 古い反復回数 | 新しい反復回数 |
---|---|---|---|
|
|
20.000 |
1.300.000 |
|
|
27.500 |
600.000 |
|
|
30.000 |
210.000 |
レルムが hashAlgorithm
と hashIterations
を使用してパスワードポリシーを明示的に構成していない場合、新しい構成は次回のパスワードベースのログイン時、またはユーザーパスワードが作成または更新されたときに有効になります。
新しいパスワードハッシュ構成のパフォーマンス
Intel i9-8950HK CPU (12) @ 4.800GHz を搭載したマシンでのテストでは、1000 個のパスワードのハッシュ処理における平均時間差が次のようになりました (3 回の実行の平均)。PBKDF2WithHmacSHA1
の平均時間は、実行時間が長いため、より少ないパスワード数で計算されたことに注意してください。
プロバイダー ID | アルゴリズム | 古い期間 | 新しい期間 | 差 |
---|---|---|---|---|
|
|
122ms |
3.114ms |
+2.992ms |
|
|
20ms |
451ms |
+431ms |
|
|
33ms |
224ms |
+191ms |
pbkdf2
プロバイダーのユーザーは、許容可能なパフォーマンスを取り戻すために、ハッシュ反復回数を明示的に減らす必要がある場合があります。これは、レルムのパスワードポリシーでハッシュ反復回数を明示的に構成することで実行できます。
予想される全体的な CPU 使用率の増加と一時的なデータベースアクティビティの増加
Keycloak 高可用性ガイドの CPU およびメモリリソースのサイジングに関するコンセプトが更新され、新しいハッシュデフォルトを反映するようになりました。パスワードベースのログインあたりの CPU 使用率は、テストでは 5 倍に増加しました。これには、変更されたパスワードハッシュと変更されていない TLS 接続処理の両方が含まれています。全体的な CPU の増加は、Keycloak の他のアクティビティ(アクセストークンとクライアントクレデンシャルの付与の更新など)の平均化効果により、約 2 ~ 3 倍になるはずです。それでも、これはインストールの固有のワークロードに依存します。
アップグレード後、パスワードベースのログイン中に、ユーザーのパスワードは新しいハッシュアルゴリズムとハッシュ反復回数で一度だけ再ハッシュされ、データベースで更新されます。これにより、ユーザーが Keycloak の内部キャッシュからクリアされるため、データベースレベルでの読み取りアクティビティの増加も確認できます。このデータベースアクティビティの増加は、再ハッシュされるユーザーのパスワードが増えるにつれて、時間の経過とともに減少します。
Operator 参照リソースポーリング
Keycloak CR を介して参照される Secrets および ConfigMaps は、API サーバーを介して監視されるのではなく、変更についてポーリングされるようになりました。変更が検出されるまでに約 1 分かかる場合があります。
これは、これらのリソースでラベル操作を必要としないようにするためです。アップグレード後、operator.keycloak.org/component ラベルがまだ付いている Secret がある場合は、削除または無視される可能性があります。
移行のための JPA プロバイダー構成オプションの名前変更
Map Store の削除後、次の構成オプションの名前が変更されました。
-
spi-connections-jpa-legacy-initialize-empty
からspi-connections-jpa-quarkus-initialize-empty
へ -
spi-connections-jpa-legacy-migration-export
からspi-connections-jpa-quarkus-migration-export
へ -
spi-connections-jpa-legacy-migration-strategy
からspi-connections-jpa-quarkus-migration-strategy
へ
モデルモジュールの名前変更
Map Store の削除後、次のモジュールの名前が変更されました。
-
org.keycloak:keycloak-model-legacy-private
からorg.keycloak:keycloak-model-storage-private
へ -
org.keycloak:keycloak-model-legacy-services
からorg.keycloak:keycloak-model-storage-services
へ
および org.keycloak:keycloak-model-legacy
モジュールは非推奨となり、次のリリースで org.keycloak:keycloak-model-storage
モジュールに置き換えられる予定です。
一時的なロックアウトログがイベントに置き換えられました
ブルートフォースプロテクターによってユーザーが一時的にロックアウトされた場合、新しいイベント USER_DISABLED_BY_TEMPORARY_LOCKOUT
が発生するようになりました。新しいイベントは構造化された形式で情報を提供するため、ID KC-SERVICES0053
のログは削除されました。
成功イベントであるため、新しいイベントはデフォルトで DEBUG
レベルでログ出力されます。すべての成功イベントのログレベルを変更するには、サーバー管理ガイドのイベントリスナーの章 で説明されているように、設定 spi-events-listener-jboss-logging-success-level
を使用します。
カスタムアクションまたはカスタムログエントリをトリガーするには、サーバー開発者ガイド のイベントリスナー SPI で説明されているように、カスタムイベントリスナーを作成します。
Operator カスタマイズプロパティキー
高度な構成のために Operator によって使用されるプロパティキーが operator.keycloak
から kc.operator.keycloak
に変更されました。
Keycloak CR リソースオプション
Keycloak CR および KeycloakRealmImport CR で resources
オプションが指定されていない場合、デフォルト値が使用されます。Keycloak デプロイメントおよびレルムインポートジョブのデフォルトの requests
メモリは 1700MiB
に設定され、limits
メモリは 2GiB
に設定されます。
Cookie の更新
Keycloak での Cookie 処理のリファクタリングの一環として、Cookie の設定方法にいくつかの変更があります。
-
リクエストがセキュアコンテキストを介している場合、すべての Cookie に secure 属性が設定されるようになりました。
-
WELCOME_STATE_CHECKER
Cookie はSameSite=Strict
を設定するようになりました。
カスタム拡張機能では、いくつかの変更が必要になる場合があります。
-
Cookie が CookieProvider を介して管理されるようになったため、
LocaleSelectorProvider.KEYCLOAK_LOCALE
は非推奨になりました。 -
HttpResponse.setWriteCookiesOnTransactionComplete
は削除されました。 -
HttpCookie
は非推奨になりました。代わりにNewCookie.Builder
を使用してください。 -
ServerCookie
は非推奨になりました。代わりにNewCookie.Builder
を使用してください。
内部アルゴリズムが HS256 から HS512 に変更されました
Keycloak が内部トークン(Keycloak 自体が消費する JWT、たとえばリフレッシュトークンやアクショントークン)に署名するために使用するアルゴリズムが、HS256
からより安全な HS512
に変更されました。新しいキープロバイダー hmac-generated-hs512
がレルムに追加されました。移行されたレルムでは、古い hmac-generated
プロバイダーと古い HS256
キーが維持され、アップグレード前に発行されたトークンを引き続き検証することに注意してください。HS256
プロバイダーは、キーローテーションガイドライン に従って古いトークンがなくなったときに手動で削除できます。
コンテナ内で実行する場合の異なる JVM メモリ設定
JVM オプション -Xms
および -Xmx
は、コンテナ内で実行する場合は -XX:InitialRAMPercentage
および -XX:MaxRAMPercentage
に置き換えられました。静的な最大ヒープサイズ設定の代わりに、Keycloak は最大値をコンテナメモリの合計の 70% として指定します。
ヒープサイズはコンテナメモリの合計に基づいて動的に計算されるため、コンテナの メモリ制限を常に設定する 必要があります。
メモリ制限が設定されていない場合、最大ヒープサイズがコンテナメモリの合計の 70% まで増加するため、メモリ消費が急速に増加します。 |
詳細については、コンテナでの Keycloak の実行 ガイドを参照してください。
GELF ログハンドラーは非推奨になりました
基盤となるライブラリ の sunsetting により、GELF との統合を提供している Keycloak は、GELF ログハンドラーをすぐにサポートしなくなります。この機能は将来のリリースで削除される予定です。外部ログ管理が必要な場合は、ファイルログ解析の使用を検討してください。
23.0.5 への移行
jboss-logging イベントメッセージの変更
issue #25078 のため、jboss-logging
メッセージ値は引用符で囲まれ(デフォルトでは文字 "
)、改行を防ぐためにサニタイズされるようになりました。プロバイダーには、新しい動作をカスタマイズできる 2 つの新しいオプション(spi-events-listener-jboss-logging-sanitize
および spi-events-listener-jboss-logging-quotes
)があります。たとえば、サニタイズと引用符の両方を避けるために、サーバーはこの方法で起動できます。
./kc.sh start --spi-events-listener-jboss-logging-sanitize=false --spi-events-listener-jboss-logging-quotes=none ...
オプションの詳細については、すべてのプロバイダー構成ガイド を参照してください。
23.0.2 への移行
クライアントの有効なリダイレクト URI は常に完全一致文字列比較で比較されます
バージョン 1.8.0 では、クライアントの指定された有効なリダイレクトとリダイレクト URI を比較する際に、ホスト名とスキームの小文字化が導入されました。残念ながら、すべてのプロトコルで完全に機能したわけではなく、たとえば、ホストは http
では小文字化されましたが、https
では小文字化されませんでした。OAuth 2.0 Security Best Current Practice では、URI を完全一致文字列比較を使用して比較することを推奨しているため、Keycloak はこの推奨事項に従い、今後は有効なリダイレクトはホスト名とスキームに対しても完全一致で比較されます。
古い動作に依存しているレルムの場合、クライアントの有効なリダイレクト URI には、サーバーによって認識される必要がある各 URI の個別のエントリを含める必要があります。
クライアントを構成する際に、より多くの手順と冗長性が導入されますが、新しい動作により、パターンベースのチェックがセキュリティ問題の原因となることが多いため、より安全なデプロイメントが可能になります。これらの問題は、実装方法と構成方法が原因です。
Operator -secrets-store Secret
以前のバージョンの Operator は、監視対象の Secrets を追跡するために Secret を作成していました。新しいバージョンの Operator は -secrets-store Secret を使用しなくなったため、削除してもかまいません。
23.0.0 または 23.0.1 を使用していて、Operator ログに "org.keycloak.operator.controllers.KeycloakAdminSecretDependentResource → java.lang.IllegalStateException: More than 1 secondary resource related to primary" が表示される場合は、-secrets-store Secret を削除するか、これが問題ではなくなった 23.0.2 にアップグレードしてください。
23.0.0 への移行
OAuth 2.0/OpenID Connect 認証応答に iss パラメータが追加されました
RFC 9207 OAuth 2.0 Authorization Server Issuer Identification 仕様では、安全な認証応答を実現するために、OAuth 2.0/OpenID Connect 認証応答にパラメータ iss
を追加します。
過去のリリースでは、このパラメータはありませんでしたが、Keycloak は仕様で要求されているように、このパラメータをデフォルトで追加するようになりました。
ただし、一部の OpenID Connect / OAuth2 アダプター、特に古い Keycloak アダプターは、この新しいパラメータに問題がある可能性があります。
たとえば、パラメータはクライアントアプリケーションへの認証が成功した後、常にブラウザ URL に存在します。このような場合、認証応答への iss
パラメータの追加を無効にすると役立つ場合があります。これは、古いアダプターとの互換性 で説明されているように、Keycloak 管理コンソールの特定のクライアントに対して、クライアントの詳細の OpenID Connect 互換モード
セクションで実行できます。認証応答から Issuer を除外
する専用スイッチが存在し、これをオンにすると、認証応答に iss
パラメータを追加しないようにすることができます。
ワイルドカード文字の処理
JPA では、検索時にワイルドカード文字 %
および _
が使用できますが、LDAP などの他のプロバイダーでは *
のみ許可されています。*
は LDAP では自然なワイルドカード文字であるため、すべての場所で機能しますが、JPA では検索文字列の先頭と末尾でのみ機能していました。今回のリリースから、唯一のワイルドカード文字は *
となり、すべてのプロバイダーの検索文字列のすべての場所で一貫して機能します。JPA の %
や _
など、特定のプロバイダーの特殊文字はすべてエスケープされます。"w*ord"
のように引用符を追加した完全一致検索の場合、動作は以前のリリースと同じままです。
テーマの言語ファイルのデフォルトエンコーディングは UTF-8
このリリースでは、Java 以降の標準メカニズムに従い、リソースバンドルファイルは UTF-8 でエンコードされていると見なすようになりました。
以前のバージョンの Keycloak では、# encoding: UTF-8
のようなコメントを最初の行に記述してエンコーディングを指定できましたが、これはサポートされなくなり、無視されます。
テーマのメッセージプロパティファイルは、UTF-8 エンコーディングで読み込まれるようになり、ISO-8859-1 エンコーディングへの自動フォールバックが追加されました。別のエンコーディングを使用している場合は、ファイルを UTF-8 に変換してください。
レルムおよびクライアントロールマッパーによってマッピングされたクレームの値形式の変更
このリリースより前は、レルム (User Realm Role
) とクライアント (User Client Role
) の両方のプロトコルマッパーが、Multivalued
設定が無効になっている場合に、文字列化された JSON 配列をマッピングしていました。
ただし、Multivalued
設定は、クレームをリストとしてマッピングするか、無効になっている場合は、同じ値リストから単一の値のみをマッピングするかを示します。
このリリースでは、ロールおよびクライアントマッパーは、単一値 (Multivalued
無効) としてマークされている場合、ユーザーの有効なロールからの単一の値にマッピングするようになりました。
ログイン UI のパスワードフィールドの変更
このバージョンでは、パスワード入力の表示/非表示を切り替えるトグルを導入します。
-
login.ftl
-
login-password.ftl
-
login-update-password.ftl
-
register.ftl
-
register-user-profile.ftl
一般に、すべての <input type="password" name="password" />
は div 内にカプセル化されるようになりました。入力要素の後には、パスワード入力の表示/非表示を切り替えるボタンが続きます。
古いコード例
<input type="password" id="password" name="password" autocomplete="current-password" style="display:none;"/>
新しいコード例
<div class="${properties.kcInputGroup!}">
<input type="password" id="password" name="password" autocomplete="current-password" style="display:none;"/>
<button class="pf-c-button pf-m-control" type="button" aria-label="${msg('showPassword')}"
aria-controls="password" data-password-toggle
data-label-show="${msg('showPassword')}" data-label-hide="${msg('hidePassword')}">
<i class="fa fa-eye" aria-hidden="true"></i>
</button>
</div>
デフォルトの Keycloak CR ホスト名
OpenShift でイングレスを有効にして実行し、spec.ingress.classname が openshift-default に設定されている場合、Keycloak CR で spec.hostname.hostname を空のままにすることができます。オペレーターは、明示的なホストなしで OpenShift Route によって作成されるものと同様のデフォルトホスト名を CR の保存されたバージョンに割り当てます。つまり、ingress-namespace.appsDomain です。appsDomain が変更された場合、または何らかの理由で別のホスト名が必要になった場合は、Keycloak CR を更新してください。
非推奨の auto-build
CLI オプションが削除されました
auto-build
CLI オプションは、長い間非推奨としてマークされていました。このリリースでは、完全に削除され、サポートされなくなりました。
start
コマンドを実行すると、構成に基づいてサーバーが自動的にビルドされます。この動作を防止するには、--optimized
フラグを設定します。
kc.sh とシェルメタ文字
kc.sh は、パラメーターと環境変数 JAVA_OPTS_APPEND および JAVA_ADD_OPENS で追加のシェル eval を使用しなくなったため、二重エスケープ/引用符の使用を続けると、パラメーターが誤解されることになります。たとえば、代わりに
bin/kc.sh start --db postgres --db-username keycloak --db-url "\"jdbc:postgresql://#:5432/keycloak?ssl=false&connectTimeout=30\"" --db-password keycloak --hostname localhost
単一のエスケープを使用してください
bin/kc.sh start --db postgres --db-username keycloak --db-url "jdbc:postgresql://#:5432/keycloak?ssl=false&connectTimeout=30" --db-password keycloak --hostname localhost
この変更は、すべての引数の単一引用符付きの値を使用して kc.sh を呼び出すことができなくなることも意味します。たとえば、次のようには使用できなくなります。
bin/kc.sh "start --help"
代わりに個々の引数にする必要があります
bin/kc.sh start --help
同様に、代わりに
bin/kc.sh build "--db postgres"
代わりに個々の引数にする必要があります
bin/kc.sh build --db postgres
個々の引数の使用は、Dockerfile run コマンドでも必須です。
RegistrationProfile フォームアクションの削除
フォームアクション RegistrationProfile
(認証フローの UI に Profile Validation
として表示) がコードベースおよびすべての認証フローから削除されました。デフォルトでは、すべてのレルムの組み込み登録フローにありました。ユーザー属性の検証と、すべてのユーザー属性を含むユーザーの作成は、RegistrationUserCreation
フォームアクションによって処理されるため、RegistrationProfile
はもう必要ありません。独自のプロバイダーで RegistrationProfile
クラスを使用した場合を除き、通常、この変更に関連して追加のアクションは必要ありません。
GroupProvider
の変更
トップレベルグループを検索およびページングするための新しいメソッドが追加されました。このインターフェイスを実装する場合は、次のメソッドを実装する必要があります。
Stream<GroupModel> getTopLevelGroupsStream(RealmModel realm,
String search,
Boolean exact,
Integer firstResult,
Integer maxResults)
GroupRepresentation
の変更
-
新しいフィールド
subGroupCount
が追加され、特定のグループにサブグループがいくつあるかをクライアントに通知します。 -
subGroups
リストは、階層データを要求するクエリでのみ入力されるようになりました -
このフィールドは「ボトムアップ」で入力されるため、グループのすべてのサブグループを取得するために信頼することはできません。
GroupProvider
を使用するか、GET {keycloak server}/realms/{realm-name}/groups/{group_id}/children
からサブグループをリクエストしてください。
グループ管理 API の新しいエンドポイント
エンドポイント GET {keycloak server}/realms/{realm-name}/groups/{group_id}/children
が、ページネーションをサポートする特定のグループのサブグループを取得する方法として追加されました。
RESTEasy Reactive
RESTEasy Classic はもはや利用できないため、RESTEasy Classic に依存することはオプションではありません。SPI および org.jboss.resteasy.spi.*
の一部である RESTEasy Classic および関連パッケージに依存しているコードには移行が必要です。
部分エクスポートには manage-realm 権限が必要
エンドポイント POST {keycloak server}/realms/{realm-name}/partial-export
および管理コンソール内の対応するアクションには、view-realm
の代わりに実行するための manage-realm
権限が必要になりました。このエンドポイントは、レルム構成を JSON ファイルにエクスポートし、新しい権限の方が適切です。エクスポートにレルムグループ/ロールとクライアントを含めるパラメーター exportGroupsAndRoles
および exportClients
は、引き続き同じ権限 (query-groups
および view-clients
) を管理します。
イベントの詳細長のトリミングオプションの削除
このリリース以降、Keycloak は EventEntity
details 列の長い値をサポートします。したがって、イベント詳細長のトリミングオプション --spi-events-store-jpa-max-detail-length
および --spi-events-store-jpa-max-field-length
はサポートされなくなりました。
ユーザープロファイルの更新
このリリースには、ユーザープロファイルをプレビューから正式にサポートされる機能に昇格させる作業に関連する多くの修正と更新が含まれています。UserProfileProvider
インターフェイスに新しく追加されたメソッド boolean isEnabled(RealmModel realm)
など、SPI には小さな変更があります。また、一部のユーザープロファイルクラスと一部のバリデーター関連クラス (ただし、組み込みバリデーター実装ではない) が keycloak-server-spi-private
モジュールから keycloak-server-spi
モジュールに移動されました。ただし、Java クラスのパッケージは同じままです。独自の UserProfileProvider
実装で組み込み実装をオーバーライドする場合など、一部の例外的なケースで影響を受ける可能性があります。ただし、UserProfileProvider
はサポートされていない SPI であることに注意してください。
Map Store の削除
Map Store は、以前のリリースでは実験的な機能でした。このリリースから、削除され、ユーザーは引き続き現在の JPA ストアを使用する必要があります。
このリリース以降、--storage
関連の CLI オプションを使用することはできなくなりました。モジュール keycloak-model-map*
は削除されました。
翻訳から名前空間を削除しました
すべての翻訳は、管理コンソール用の 1 つのファイルに移動されました。独自の翻訳を作成した場合、または管理コンソールを拡張した場合は、それらをこの新しい形式に移行する必要があります。また、データベースに「オーバーライド」がある場合は、キーから名前空間を削除する必要があります。一部のキーは異なる名前空間でのみ同じですが、これはヘルプで最も顕著です。このような場合、キーに Help
を後置しました。
必要に応じて、この node スクリプトを使用して移行を支援できます。すべての単一ファイルを新しいファイルにまとめ、マッピングの一部も処理します。
import { readFileSync, writeFileSync, appendFileSync } from "node:fs";
const ns = [
"common",
"common-help",
"dashboard",
"clients",
"clients-help",
"client-scopes",
"client-scopes-help",
"groups",
"realm",
"roles",
"users",
"users-help",
"sessions",
"events",
"realm-settings",
"realm-settings-help",
"authentication",
"authentication-help",
"user-federation",
"user-federation-help",
"identity-providers",
"identity-providers-help",
"dynamic",
];
const map = new Map();
const dup = [];
ns.forEach((n) => {
const rawData = readFileSync(n + ".json");
const translation = JSON.parse(rawData);
Object.entries(translation).map((e) => {
const name = e[0];
const value = e[1];
if (map.has(name) && map.get(name) !== value) {
if (n.includes("help")) {
map.set(name + "Help", value);
} else {
map.set(name, value);
dup.push({
name: name,
value: map.get(name),
dup: { ns: n, value: value },
});
}
} else {
map.set(name, value);
}
});
});
writeFileSync(
"translation.json",
JSON.stringify(Object.fromEntries(map.entries()), undefined, 2),
);
const mapping = [
["common:clientScope", "clientScopeType"],
["identity-providers:createSuccess", "createIdentityProviderSuccess"],
["identity-providers:createError", "createIdentityProviderError"],
["clients:createError", "createClientError"],
["clients:createSuccess", "createClientSuccess"],
["user-federation:createSuccess", "createUserProviderSuccess"],
["user-federation:createError", "createUserProviderError"],
["authentication-help:name", "flowNameHelp"],
["authentication-help:description", "flowDescriptionHelp"],
["clientScopes:noRoles", "noRoles-clientScope"],
["clientScopes:noRolesInstructions", "noRolesInstructions-clientScope"],
["users:noRoles", "noRoles-user"],
["users:noRolesInstructions", "noRolesInstructions-user"],
["clients:noRoles", "noRoles-client"],
["clients:noRolesInstructions", "noRolesInstructions-client"],
["groups:noRoles", "noRoles-group"],
["groups:noRolesInstructions", "noRolesInstructions-group"],
["roles:noRoles", "noRoles-roles"],
["roles:noRolesInstructions", "noRolesInstructions-roles"],
["realm:realmName:", "realmNameField"],
["client-scopes:searchFor", "searchForClientScope"],
["roles:searchFor", "searchForRoles"],
["authentication:title", "titleAuthentication"],
["events:title", "titleEvents"],
["roles:title", "titleRoles"],
["users:title", "titleUsers"],
["sessions:title", "titleSessions"],
["client-scopes:deleteConfirm", "deleteConfirmClientScopes"],
["users:deleteConfirm", "deleteConfirmUsers"],
["groups:deleteConfirm_one", "deleteConfirmGroup_one"],
["groups:deleteConfirm_other", "deleteConfirmGroup_other"],
["identity-providers:deleteConfirm", "deleteConfirmIdentityProvider"],
["realm-settings:deleteConfirm", "deleteConfirmRealmSetting"],
["roles:whoWillAppearLinkText", "whoWillAppearLinkTextRoles"],
["users:whoWillAppearLinkText", "whoWillAppearLinkTextUsers"],
["roles:whoWillAppearPopoverText", "whoWillAppearPopoverTextRoles"],
["users:whoWillAppearPopoverText", "whoWillAppearPopoverTextUsers"],
["client-scopes:deletedSuccess", "deletedSuccessClientScope"],
["identity-providers:deletedSuccess", "deletedSuccessIdentityProvider"],
["realm-settings:deleteSuccess", "deletedSuccessRealmSetting"],
["client-scopes:deleteError", "deletedErrorClientScope"],
["identity-providers:deleteError", "deletedErrorIdentityProvider"],
["realm-settings:deleteError", "deletedErrorRealmSetting"],
["realm-settings:saveSuccess", "realmSaveSuccess"],
["user-federation:saveSuccess", "userProviderSaveSuccess"],
["realm-settings:saveError", "realmSaveError"],
["user-federation:saveError", "userProviderSaveError"],
["realm-settings:validateName", "validateAttributeName"],
["identity-providers:disableConfirm", "disableConfirmIdentityProvider"],
["realm-settings:disableConfirm", "disableConfirmRealm"],
["client-scopes:updateSuccess", "updateSuccessClientScope"],
["client-scopes:updateError", "updateErrorClientScope"],
["identity-providers:updateSuccess", "updateSuccessIdentityProvider"],
["identity-providers:updateError", "updateErrorIdentityProvider"],
["user-federation:orderChangeSuccess", "orderChangeSuccessUserFed"],
["user-federation:orderChangeError", "orderChangeErrorUserFed"],
["authentication-help:alias", "authenticationAliasHelp"],
["authentication-help:flowType", "authenticationFlowTypeHelp"],
["authentication:createFlow", "authenticationCreateFlowHelp"],
["client-scopes-help:rolesScope", "clientScopesRolesScope"],
["client-scopes-help:name", "scopeNameHelp"],
["client-scopes-help:description", "scopeDescriptionHelp"],
["client-scopes-help:type", "scopeTypeHelp"],
["clients-help:description", "clientDescriptionHelp"],
["clients-help:clientType", "clientsClientTypeHelp"],
["clients-help:scopes", "clientsClientScopesHelp"],
["common:clientScope", "clientScopeTypes"],
["dashboard:realmName", "realmNameTitle"],
["common:description", "description"],
];
mapping.forEach((m) => {
const key = m[0].split(":");
try {
const data = readFileSync(key[0] + ".json");
const translation = JSON.parse(data);
const value = translation[key[1]];
if (value) {
appendFileSync(
"translation.json",
'"' + m[1] + '": ' + JSON.stringify(value) + ',\n',
);
}
} catch (error) {
console.error("skipping namespace key: " + key);
}
});
これを public/locale/<language>
フォルダーの transform.mjs
というファイルに保存し、次のように実行します。
node ./transform.mjs
これは完全な変換を実行しない可能性がありますが、非常に近いものになるはずです。 |
22.0.2 への移行
クライアントの詳細設定コンボから [有効期限なし] オプションを削除しました
[有効期限なし] オプションが、[詳細設定] クライアントタブのすべてのコンボから削除されました。このオプションは、さまざまな有効期間またはアイドルタイムアウトが無限ではなく、一般的なユーザーセッションまたはレルムの値によって制限されていたため、誤解を招くものでした。したがって、このオプションは削除され、残りの 2 つのオプション ([レルム設定から継承] (クライアントは一般的なレルムタイムアウトを使用) および [有効期限]) (値はクライアントに対してオーバーライドされます) が優先されます。内部的には、[有効期限なし] は -1
で表されていました。現在、その値は管理コンソールに警告付きで表示され、管理者によって直接設定することはできません。
新しい LinkedIn OpenID Connect ソーシャルプロバイダー
ビジネスおよび雇用に特化したプラットフォーム向けに、**LinkedIn OpenID Connect** という新しいソーシャルアイデンティティプロバイダーが導入されました。LinkedIn は最近、開発者向けの新しい製品 Sign In with LinkedIn using OpenID Connect をリリースしました。この製品は、OpenID Connect を使用してメンバーを認証する新しい方法を提供しますが、デフォルトの **OpenID Connect v1.0** アイデンティティプロバイダーは現時点では機能しません。そのため、Keycloak はこの新しいアイデンティティプロバイダーを新しい製品の特定のソーシャルプロバイダーとして追加します。
OAuth に基づく古い LinkedIn の方法は、開発者ポータル から完全に削除されたようです。既存の LinkedIn ソーシャルプロバイダーが現在のアプリケーションでどのように機能しているかは不明です。Keycloak は、古いプロバイダーの名前を **LinkedIn (非推奨)** に変更して維持していますが、デフォルトで無効になっている **linkedin-oauth** という非推奨の機能にあります。将来のバージョンでは削除される予定です。必要に応じて、起動時に再度有効にしてください。
kc.[sh|bat] start --features linkedin-oauth ...
22.0.0 への移行
Java EE から Jakarta EE への移行
Keycloak は、コードベースを Java EE (Enterprise Edition) から後継の Jakarta EE に移行しました。これにより、Keycloak にさまざまな変更がもたらされます。
Jakarta EE 10 をサポートするために、すべての Jakarta EE 仕様をアップグレードしました。次に例を示します。
-
Jakarta Persistence 3.1
-
Jakarta RESTful Web Services 3.1
-
Jakarta Mail API 2.1
-
Jakarta Servlet 6.0
-
Jakarta Activation 2.1
Jakarta EE 10 は、クラウドネイティブな Java アプリケーションを構築するための、最新化、簡素化、軽量化されたアプローチを提供します。このイニシアチブ内で提供される主な変更点は、名前空間を javax.*
から jakarta.*
に変更することです。javax.security
、javax.net
、javax.crypto
など、JDK で直接提供される javax.*
パッケージには適用されません。
カスタム拡張機能、プロバイダー、または JPA エンティティでこれらの変更の影響を受ける可能性があります。
Quarkus 3 へのアップグレード
Keycloak は、Quarkus Java フレームワークのバージョン 3 にアップグレードしました。Quarkus 3 は、Java 開発を推進し、最新テクノロジーで最先端のユーザーエクスペリエンスを提供するという伝統を受け継いでいます。全体的なパフォーマンスと効率を引き続き向上させています。
Quarkus 3 は Jakarta EE 10 をベースにしており、Keycloak と同じであるため、スムーズな相互運用性が実現します。さらに、Jakarta EE 10 Core Profile に準拠した Eclipse MicroProfile 6 が含まれています。Quarkus 3 のアップグレードの中心部分は、JPA 3.1 と Hibernate ORM 6 の組み込みサポートです。
quarkus.hibernate-orm.*
プロパティが機能しなくなりました
Quarkus 3 の場合、Hibernate ORM 構成は、persistence.xml
ファイルまたは Quarkus プロパティのいずれかで指定する必要がありますが、両方の場所で指定することはできません。Keycloak は persistence.xml
ファイルを使用しているため、デフォルトの永続ユニット (名前が quarkus.hibernate-orm
で始まる) の Quarkus 構成プロパティを介して Keycloak の JPA ストア構成をオーバーライドすることはできなくなりました。
Hibernate ORM 6 へのアップグレード
Keycloak は、Hibernate ORM 6.2 へのアップグレードの恩恵を受けるようになりました。これには、パフォーマンスの向上、SQL の改善、最新の JDK サポート、および最新の RDBMS 機能のサポートが含まれています。パフォーマンスの向上は、主に JDBC、HQL 変換、および Criteria 変換に影響を与えます。
カスタムプロバイダーまたは JPA エンティティがある場合、これらの変更が影響を与える可能性があります。
Quarkus 移行ガイド または Hibernate リリースノート を参照して、詳細を確認することをお勧めします。
Keycloak JS アダプターからレガシー Promise API を削除しました
レガシー Promise API メソッドが Keycloak JS アダプターから削除されました。これは、アダプターから返された Promise で .success()
および .error()
を呼び出すことができなくなったことを意味します。代わりに、.then()
や .catch()
などの標準化された Promise メソッドを使用する必要があります。
const keycloak = new Keycloak();
keycloak.init()
.success(function(authenticated) {
alert(authenticated ? 'authenticated' : 'not authenticated');
}).error(function() {
alert('failed to initialize');
});
const keycloak = new Keycloak();
keycloak.init()
.then(function(authenticated) {
alert(authenticated ? 'authenticated' : 'not authenticated');
}).catch(function() {
alert('failed to initialize');
});
await
キーワードを使用してこれらの Promise をアンラップする場合const keycloak = new Keycloak();
try {
const authenticated = await keycloak.init();
alert(authenticated ? 'authenticated' : 'not authenticated');
} catch (error) {
alert('failed to initialize');
}
エクスポートとインポートで自動ビルドを実行
以前のリリースでは、export
および import
コマンドを実行する前に、build
コマンドを最初に実行する必要がありました。このリリース以降、export
および import
コマンドは、ビルド時の構成が変更された場合、Keycloak の自動再ビルドを実行します。
最初に build
コマンドを実行する既存のスクリプトを移行する場合は、--optimized
コマンドラインオプションを export
および import
コマンドに追加して移行し、Keycloak が自動的にイメージを再ビルドしないようにします。この --optimized
オプションを追加しないと、Keycloak が再ビルドをトリガーしてデフォルト値に戻る可能性があり、エクスポートとインポートのためにデータベースに接続しても機能しなくなります。
次の例では、データベースパスワードなどのランタイムパラメーターが構成ファイルまたは環境変数を介して提供されることを前提としています。
bin/kc.[sh|bat] build --db=postgres ...
bin/kc.[sh|bat] export --dir <dir>
--optimized
をエクスポートコマンドに追加するbin/kc.[sh|bat] build --db=postgres ...
bin/kc.[sh|bat] export --optimized --dir <dir>
bin/kc.[sh|bat] export --dir <dir> --db=postgres ...
- 注
-
自動ビルドが実行されると、ビルド時のオプションは、
start
コマンドを含む、--optimized
フラグで開始される後続のすべてのコマンドに対して有効になります。
以前のリリースでは、export
および import
コマンドでは、データベース URL などのランタイムパラメーターは構成ファイルまたは環境変数でのみ許可されていました。このリリース以降、これらのランタイムパラメーターはコマンドラインでも使用できるようになりました。サポートされているパラメーターについては、--help
オプションを使用してください。
Keycloak 管理クライアントアーティファクトの名前変更
Jakarta EE へのアップグレード後、Keycloak 管理クライアントのアーティファクトの名前は、長期的な保守性を考慮して、より説明的な名前に変更されました。Jakarta EE と Java EE のサポートを備えた 2 つの個別の Keycloak 管理クライアントを引き続き提供します。
org.keycloak:keycloak-admin-client-jakarta
アーティファクトのリリースを停止しました。Jakarta EE サポートを備えた Keycloak 管理クライアントのデフォルトは、org.keycloak:keycloak-admin-client
(バージョン 22.0.0 以降) です。
Java EE サポートを備えた新しいアーティファクトは org.keycloak:keycloak-admin-client-jee
です。
パススループロキシモードの変更
モード **passthrough** の Keycloak のプロキシ構成設定は、リクエスト内の HTTP 転送ヘッダーを解析しなくなりました。これは、プロキシがパススルーモードで HTTPS 接続を転送する場合、プロキシは HTTP ヘッダーを追加、削除、または更新できないためです。
クライアントのリクエストの HTTP ヘッダーを解析したいインストールでは、**edge** または **reencrypt** 設定を使用する必要があります。
詳細については、リバースプロキシの使用 を参照してください。
すべてのテーマで一貫性のあるフォールバックメッセージ解決
この変更は、レルムローカライズメッセージを使用している場合にのみ影響を与える可能性があります。
このバージョンまで、レルムローカライズメッセージを使用した場合、フォールバックメッセージの解決はテーマ間で一貫性がありませんでした。詳細については、次の 問題 を参照してください。
実装はすべてのテーマで統一されました。一般に、最も具体的な一致する言語タグのメッセージが最も優先順位が高くなります。レルムローカライズメッセージとテーマ i18n メッセージの両方がある場合、レルムローカライズメッセージの方が優先順位が高くなります。要約すると、メッセージの優先順位は次のとおりです (RL = レルムローカライズ、T = テーマ i18n ファイル): RL <variant> > T <variant> > RL <region> > T <region> > RL <language> > T <language> > RL en > T en
。
おそらく、例でよりよく説明できます。バリアント de-CH-1996
がリクエストされ、バリアントのレルムローカライズメッセージがある場合、このメッセージが使用されます。そのようなレルムローカライズメッセージが存在しない場合、テーマ i18n ファイルでそのバリアントに対応するメッセージが検索されます。そのようなメッセージが存在しない場合、地域 (de-CH
) のレルムローカライズメッセージが検索されます。そのようなレルムローカライズメッセージが存在しない場合、テーマ i18n ファイルでその地域のメッセージが検索されます。それでもメッセージが見つからない場合は、言語 (de
) のレルムローカライズメッセージが検索されます。一致するレルムローカライズメッセージがない場合、テーマ i18n ファイルでその言語のメッセージが検索されます。最後のフォールバックとして、英語 (en
) の翻訳が使用されます。最初に、英語のレルムローカライズが検索され、見つからない場合は、テーマ i18n ファイルで英語のメッセージが検索されます。
UserQueryProvider
の変更
UserQueryProvider
インターフェイスが 2 つに分割されました。1 つはユーザーのクエリ機能を提供する UserQueryMethodsProvider
です。2 つ目は、特定のストレージ内のユーザー数をカウントする機能を提供する UserCountMethodsProvider
です。
Keycloak は、カウントクエリを効率的に実行できるユーザー ストレージプロバイダーと、そうでないプロバイダーを区別できるようになりました。UserQueryProvider
インターフェイスは引き続き存在し、両方の新しいインターフェイスを拡張します。したがって、UserQueryProvider
の既存の実装では、同じメソッドを保持しているため、変更は必要ありません。
LDAPStorageProvider
の検索変更
このリリース以降、Keycloak はフェデレーション LDAP データベースのクエリ時にページネーションメカニズムを使用します。ユーザーの検索は、ローカルデータベースの検索と一貫性がある必要があります。
このリリース以降、LDAPStorageProvider
は UserQueryProvider
ではなく、UserQueryMethodsProvider
のみを実装します。
Keycloak OpenID Connect アダプターの非推奨
このリリース以降、次の Keycloak OpenID Connect アダプターに時間を費やすことはなくなります。
-
Keycloak Wildfly OpenID Connect アダプター
-
Keycloak JEE サーブレット OpenID Connect アダプター
-
Keycloak Spring Boot および Spring Security OpenID Connect アダプター
この動きは、ドキュメントとクイックスタートリポジトリにすでに反映されています。詳細については、次のリファレンスを参照してください。
上記の参照から代替案へのアプリケーションの移行を検討し始めることをお勧めします。これらのアダプターは、将来のリリースでは利用できなくなるはずです。
Keycloak JEE SAML アダプターの非推奨
Keycloak JEE SAML アダプターは廃止され、このリリース以降、その開発に時間を費やすことはなくなります。
公式アダプターは Jakarta ベースになり、アプリケーションをこのテクノロジーに切り替えたらすぐに使用する必要があります。
この変更は、ドキュメントとクイックスタートリポジトリにすでに反映されています。詳細については、次のリファレンスを参照してください。
アプリケーションを Jakarta に移行できない場合は、「レガシー」SAML JEE アダプターを引き続き使用でき、サーバーの将来のリリースと統合することができます。ただし、JEE のサポートは提供されなくなったため、できるだけ早くアプリケーションをアップグレードすることを検討してください。
openshift-integration 機能の変更
プレビュー機能 openshift-integration
が Keycloak コードベースから削除され、個別の拡張機能に移動されました。これには、カスタムクライアントストレージプロバイダーや Openshift 統合用のトークンレビューエンドポイントなどの関連プロバイダーの移動が含まれます。
この機能を使用していた場合は、Keycloak サーバーの起動時に openshift-integration
機能を使用するのをやめ、代わりにカスタム拡張機能から JAR ファイルをデプロイする必要があります。Openshift 拡張機能 とその README ファイルの手順で、拡張機能を Keycloak サーバーにデプロイする方法を確認できます。
Openshift 拡張機能は、Keycloak チームによって公式にサポートおよび保守されていません。ご自身の責任でのみ使用できます。 |
Http Challenge フローの削除
組み込み認証フロー http challenge
が、認証器実装 no-cookie-redirect
、basic-auth
、および basic-auth-otp
とともに削除されました。http challenge
認証フローも Openshift 統合を目的としていたため、上記の他の関連機能とともに削除されました。認証器実装は、前の段落で説明した Openshift 拡張機能に移動されました。
http challenge
フローをレルムフローとして、またはアイデンティティプロバイダーの First Broker Login
または Post Broker Login
フローとして使用している場合、移行は不可能です。移行前に、http challenge
フローの使用を排除するようにレルム構成を更新してください。http challenge
フローをクライアントの Authentication Flow Binding Override
として使用している場合、移行は完了しますが、そのクライアントにログインできなくなります。移行後、フローを再作成し、新しい/異なる JSON フローを使用するようにクライアントの構成を更新する必要があります。
サードパーティの依存関係の削除
openshift-integration の削除により、Keycloak ディストリビューションからいくつかのサードパーティの依存関係を削除できます。これには、openshift-rest-client
、okio-jvm
、okhttp
、commons-lang
、commons-compress
、jboss-dmr
、および kotlin-stdlib
が含まれます。これは、これらのライブラリのいずれかを Keycloak サーバーにデプロイされた独自のプロバイダーの依存関係として使用する場合、これらの jar
ファイルも明示的に Keycloak ディストリビューションの providers
ディレクトリにコピーする必要がある場合があることを意味します。
JAX-RS リソースでコンテキストと依存性注入が有効にならなくなりました
より優れたランタイムを提供し、基盤となるスタックを最大限に活用するために、javax.ws.rs.core.Context
アノテーションを使用したコンテキストデータのすべてのインジェクションポイントが削除されました。パフォーマンスの向上は、リクエストライフサイクル中にプロキシインスタンスを複数回作成することをなくし、ランタイム時のリフレクションコードの量を大幅に削減することによって実現されます。
次の SPI のいずれかを拡張している場合
-
PolicySpi
-
AdminRealmResourceSpi
-
IdentityProviderSpi
-
RealmResourceSPI
コンテキストデータを取得するために、カスタム JAX-RS (サブ) リソースを確認する必要があります。次のようにします。
KeycloakSession session = org.keycloak.common.util.Resteasy.getContextData(KeycloakSession.class);
現在のリクエストおよびレスポンスオブジェクトにアクセスする必要がある場合は、KeycloakSession
から直接インスタンスを取得できるようになりました。
@Context
org.jboss.resteasy.spi.HttpRequest request;
@Context
org.jboss.resteasy.spi.HttpResponse response;
次のように置き換えられました。
KeycloakSession session = // obtain the session, which is usually available when creating a custom provider from a factory
KeycloakContext context = session.getContext();
HttpRequest request = context.getHttpRequest();
HttpResponse response = context.getHttpResponse();
JAX-RS リソースメソッドを呼び出すときに KeycloakSession
インスタンスにアクセスできない場合は、次のように JAX-RS ランタイムからコンテキストデータを取得できます。
KeycloakSession session = org.keycloak.common.util.Resteasy.getContextData(KeycloakSession.class);
追加のコンテキストデータは、KeycloakContext
インスタンスを介してランタイムから取得できます。
KeycloakSession session = // obtain the session
KeycloakContext context = session.getContext();
MyContextualObject myContextualObject = context.getContextObject(MyContextualObject.class);
カスタム JAX-RS リソースのアップグレード
次の SPI を介してサーバーの REST API を拡張している場合
-
PolicySpi
-
AdminRealmResourceSpi
-
IdentityProviderSpi
-
RealmResourceSPI
カスタムプロバイダーがパッケージ化されている JAR ファイルに空の META-INF/beans.xml
を追加する必要があります。そうしないと、ランタイム時にサーバーによって認識されません。
RealmResourceSPI
または AdminRealmResourceSpi
を使用している場合、META-INF
の下に beans.xml
という空のファイルを追加するか、JAX-RS リソースクラスに jakarta.ws.rs.ext.Provider
アノテーションを付けるかのいずれかを選択できます。
また、JAX-RS メソッドが、それぞれ @Consumes
および @Produces
アノテーションを付与することで、入出力に予期されるメディアタイプを宣言していることを確認する必要があります。
データプロバイダーとモデルからの非推奨メソッド
以前のバージョンの Keycloak では、プロバイダーとモデルのインターフェースは、特定のメソッドを非推奨とするクリーンアッププロセスを経ました。このリリースでは、これらのメソッドは削除され、さらにいくつかのメソッドが非推奨となりました。Keycloak 21 のこれらのメソッドの Javadoc には、対応する代替メソッドに関する情報が含まれていました。
-
RealmModel#searchForGroupByNameStream(String, Integer, Integer)
は削除されました。 -
UserProvider#getUsersStream(RealmModel, boolean)
は削除されました。 -
UserSessionPersisterProvider#loadUserSessions(int, int, boolean, int, String)
は削除されました。 -
Streamification 作業のために追加されたインターフェース(
RoleMapperModel.Streams
など)は削除されました。 -
フェデレーションストレージプロバイダークラスの
Streams
インターフェースは非推奨となりました。 -
KeycloakModelUtils#getClientScopeMappings
は削除されました。 -
KeycloakSession
からの非推奨メソッドは削除されました。 -
UserQueryProvider#getUsersStream
メソッドは削除されました。
複数の Keycloak インスタンス
複数の Keycloak CR を同じ名前空間に作成でき、オペレーターによって個別に管理されます。これを可能にするには、古いバージョンのオペレーターによって作成された StatefulSet を再作成する必要があります。これはオペレーターがアップグレードされると自動的に行われ、わずかなダウンタイムが発生します。
k8s.keycloak.org/v2alpha1 の変更
条件ステータスフィールドは、標準の Kubernetes 条件に準拠するために、ブール値から文字列に変更されました。CRD では一時的に任意の内容を受け入れるように表現されますが、実際には常に文字列になります。このフィールドの使用箇所をすべて更新して、true または false ではなく、"True"、"False"、または "Unknown" の値が予期されるようにしてください。
Keycloak は IPv4/IPv6 デュアルスタックをサポート
Keycloak は IPv4/IPv6 デュアルスタックをサポートしており、デフォルトで IPv4 および IPv6 アドレス経由でアクセスできます。以前のバージョンの Keycloak では、デフォルトのアプローチは IPv4 アドレスのみを使用することでした。
詳細については、IPv4 または IPv6 で Keycloak サーバーを構成する を参照してください。
21.1.0 への移行
Classpath でデフォルトで利用可能な Javascript エンジン
以前のバージョンでは、Java 17 で Javascript プロバイダー(スクリプト認証、Javascript 認可ポリシー、または OIDC および SAML クライアントのスクリプトプロトコルマッパー)で Keycloak を使用する場合、javascript エンジンをディストリビューションにコピーする必要がありました。Nashorn javascript エンジンが Keycloak サーバーでデフォルトで利用できるようになったため、これは不要になりました。スクリプトプロバイダーをデプロイする場合、nashorn スクリプトエンジンとその依存関係を Keycloak ディストリビューションにコピーしないことをお勧めします。
サービスアカウントクライアントのデフォルトクライアント ID マッパーの変更
サービスアカウントクライアント
のデフォルトの クライアント ID
マッパーが変更されました。トークンクレーム名
フィールドの値が clientId
から client_id
に変更されました。client_id
クレームは OAuth2 仕様に準拠しています。
clientId
userSession ノートは引き続き存在します。
Keycloak JS アダプターは new
演算子でインスタンス化する必要がある
歴史的に、Keycloak()
関数を直接呼び出すことで Keycloak JS アダプターのインスタンスを作成することが可能でした。
const keycloak = Keycloak();
これを JavaScript 世界の最新の慣例に合わせるために、代わりに new
演算子 を使用してインスタンスを作成することが可能になりました。
const keycloak = new Keycloak();
関数スタイルのコンストラクターはしばらくの間非推奨となっていましたが、このバージョンから、使用時に非推奨メッセージを積極的にログに記録します。このスタイルのコンストラクターは将来のバージョンで削除される予定ですので、コードを移行して new
演算子を使用するようにしてください。
21.0.0 への移行
Keycloak はメトリクスに Micrometer を使用
Keycloak は、Prometheus 形式でメトリクスをエクスポートするオプションのメトリクスエンドポイントを提供します。このリリースでは、このデータを提供する実装が SmallRye から Micrometer に切り替えられました。Micrometer は、Quarkus に推奨されるメトリクスライブラリ です。
この変更により、メトリクスは名前が変更されました。次の表にいくつかの例を示します。
アップグレードする前に、エンドポイントから返されるすべてのメトリクスを、変更前と変更後で確認し、ダッシュボードとアラートでの使用状況を更新することをお勧めします。
古いメトリクス名 | 新しいメトリクス名 |
---|---|
|
|
|
|
|
|
|
|
SAML の非推奨の RSA_SHA1 および DSA_SHA1 アルゴリズム
SAML アダプター、クライアント、およびアイデンティティプロバイダーで 署名アルゴリズム
として構成できるアルゴリズム RSA_SHA1
および DSA_SHA1
は非推奨となりました。SHA256
または SHA512
に基づくより安全な代替手段を使用することをお勧めします。また、これらのアルゴリズムを使用した署名付き SAML ドキュメントまたはアサーションの署名検証は、Java 17 以降では機能しません。このアルゴリズムを使用しており、SAML ドキュメントを利用する相手が Java 17 以降で実行されている場合、署名検証は機能しません。
考えられる回避策は、$JAVA_HOME/conf/security/java.security
ファイルのプロパティ jdk.xml.dsig.secureValidationPolicy
で構成されている「許可されないアルゴリズム」のリストから、http://www.w3.org/2000/09/xmldsig#rsa-sha1
や http://www.w3.org/2000/09/xmldsig#dsa-sha1
などのアルゴリズムを削除することです。
SAML SP メタデータの変更
このバージョンでは、Keycloak は署名目的で生成されたレルムキーを使用して暗号化されたアサーションの復号化を拒否します。この変更は、IDP から SP (Keycloak が SP として機能する) へのすべての暗号化通信が動作を停止することを意味します。
これを機能させるには 2 つの方法があります。
-
新しいバージョンの Keycloak で生成されたメタデータで IDP 構成を更新するか、
-
古い Keycloak バージョンで生成されたメタデータで Keycloak が動作する下位互換モードで Keycloak を実行します。このモードは、
-Dkeycloak.saml.deprecated.encryption=true
フラグを使用して有効にできます。この下位互換モードは Keycloak 24 で削除される予定であることに注意してください。
ユーザーセッションプロバイダーからの非推奨メソッドが削除されました
Keycloak 13 では UserLoginFailureProvider
が導入され、UserSessionProvider
からいくつかのメソッドがそこに移動されました。UserSessionProvider
のメソッドは非推奨となり、削除されました。これらのメソッドの Javadoc には、対応する代替メソッドが含まれていました (Keycloak 20 リリースの Javadoc を参照)。
古い管理コンソールを使用するカスタムテーマは動作しません
以前のバージョンで非推奨となった古い管理コンソールがついに削除されました。これは、古い管理コンソールを親テーマとして使用したり、古い管理コンソールからインポートしたりしていたカスタムテーマが動作しなくなることも意味します。古い管理コンソールを拡張することはもはや適用できず、そのようなテーマがデプロイされていると Keycloak で問題 (少なくともログに警告またはエラー) が発生する可能性があるため、そのようなテーマを一切デプロイしないことを強くお勧めします。
Curl がコンテナから削除されました
Keycloak コンテナイメージ は、セキュリティを強化するために変更されました。その結果、カスタマイズされたイメージで使用していた可能性のある curl
やその他の CLI ツールが削除されました。この変更の処理方法については、更新された コンテナガイド を参照してください。
20.0.0 への移行
H2 バージョンの更新
Keycloak は開発目的で H2 データベースドライバーを同梱しています。開発目的のみを意図しているため、本番環境で使用しないでください。
このリリースでは、H2 ドライバーがバージョン 1.x からバージョン 2.x にアップグレードされました。この変更により、既存の Keycloak セットアップで H2 JDBC URL または H2 データベースファイルの移行が必要になる場合があります。
H2 JDBC URL の変更
Keycloak が H2 バージョン 2.x で JPA レガシーストアを使用して実行されるには、JDBC URL に属性 NON_KEYWORDS=VALUE
が必要です。
追加のパラメーターなしで Keycloak によって H2 が初期化されるセットアップでは、Keycloak は属性を自動的に追加します。これは開発セットアップのデフォルトです。
H2 JDBC URL がコマンドラインまたは構成ファイルで指定されており、JDBC URL にすでに NON_KEYWORDS=
属性が含まれている場合、この属性に VALUE
キーワードを追加する必要があります。
H2 データベースの接続ファクトリが Keycloak の外部で初期化される場合、その初期化で NON_KEYWORDS
属性を追加する必要があります。
詳細については、H2 ドキュメントの NON_KEYWORDS
属性に関する説明 を参照してください。
H2 データベースファイルのアップグレード
H2 バージョン 1.x で作成された H2 データベースベースファイルは、バージョン 2.x で使用しないでください。
既存の H2 データベースファイルを削除して空のデータベースから開始するか、Keycloak のエクスポートおよびインポート機能を使用してレルムをエクスポートおよびインポートするか、H2 データベースコンテンツの移行方法の詳細については、H2 データベースプロジェクトの Web サイトの移行に関する注意事項 を参照してください。
新しいバージョンの Keycloak Operator の互換性を損なう変更
最新バージョンの Keycloak Operator を使用するには、CR の手動での再インストールとアップグレードが必要です。自動移行はありません。 |
このリリースには、Keycloak CR における次の互換性を損なう変更が含まれています。
serverConfiguration 自由形式フィールドの名前が変更されました
今後は additionalOptions
と呼ばれます。この決定の背景にある考え方は、Keycloak Quarkus ディストリビューションとの整合性を高め、命名規則の一貫性を実現/維持することです。serverConfiguration
は、Keycloak カスタムリソース (CR) で宣言された代替手段がないオプションを構成するために引き続き使用できます。そのような使用の良い例としては、サービスプロバイダーが挙げられます。
Ingress オプションが改善されました
以前は、disableDefaultIngress
プロパティを介して定義されていました。これを少し明確にすることにしました。そのため、今後は次の構造を使用して Ingress 設定を制御できます。
spec:
...
ingress:
enabled: false
HTTP オプションが追加されました
Ingress と同様に、より構造化された方法で複数の HTTP オプションを定義できます。
spec:
...
http:
httpEnabled: true
httpPort: 80
httpsPort: 443
tlsSecret: my-tls-secret
データプロバイダーとモデルからの非推奨メソッドが削除されました
Keycloak 15 より前に、プロバイダーとモデルのインターフェースのクリーンアップがあり、そこでいくつかのメソッドを非推奨としました。これらのメソッドの Javadoc には、対応する代替メソッドが含まれていました (Keycloak 19 リリースの Javadoc を参照)。このリリースでは、これらのメソッドは削除されました。以下に変更されたすべてのクラスのリストを示します。
メソッドを非推奨および削除するための最も一般的なパターンは次のとおりです。
-
Streamification - インターフェースにはストリームベースのメソッドのみが含まれるようになりました。
たとえば、
GroupProvider
インターフェースでは@Deprecated List<GroupModel> getGroups(RealmModel realm);
次のように置き換えられました。
Stream<GroupModel> getGroupsStream(RealmModel realm);
streamification 作業の詳細については、KEYCLOAK-14011 を参照してください。
-
一貫性のあるパラメーター順序 - メソッドには、
RealmModel
が常に最初のパラメーターである厳密なパラメーター順序が設定されるようになりました。たとえば、
UserLookupProvider
インターフェースでは@Deprecated UserModel getUserById(String id, RealmModel realm);
次のように置き換えられました。
UserModel getUserById(RealmModel realm, String id)
変更されたインターフェースのリスト
(o.k.
は org.keycloak.
パッケージを表します)
-
server-spi
モジュール-
o.k.credential.CredentialInputUpdater
-
o.k.credential.UserCredentialStore
-
o.k.models.ClientProvider
-
o.k.models.ClientSessionContext
-
o.k.models.GroupModel
-
o.k.models.GroupProvider
-
o.k.models.KeyManager
-
o.k.models.KeycloakSessionFactory
-
o.k.models.ProtocolMapperContainerModel
-
o.k.models.RealmModel
-
o.k.models.RealmProvider
-
o.k.models.RoleContainerModel
-
o.k.models.RoleMapperModel
-
o.k.models.RoleModel
-
o.k.models.RoleProvider
-
o.k.models.ScopeContainerModel
-
o.k.models.UserCredentialManager
-
o.k.models.UserModel
-
o.k.models.UserProvider
-
o.k.models.UserSessionProvider
-
o.k.models.utils.RoleUtils
-
o.k.sessions.AuthenticationSessionProvider
-
o.k.storage.client.ClientLookupProvider
-
o.k.storage.group.GroupLookupProvider
-
o.k.storage.user.UserLookupProvider
-
o.k.storage.user.UserQueryProvider
-
-
server-spi-private
モジュール-
o.k.events.EventQuery
-
o.k.events.admin.AdminEventQuery
-
o.k.keys.KeyProvider
-
すべての変更は、次の issue にリンクされています。
19.0.2 への移行
OpenID Connect ログアウトプロンプト
Keycloak 18.0.0 で、ログアウトは新しい OIDC 仕様と互換性を持つようになりました。新しい OIDC 仕様では、URL パラメーターの処理が変更されました。ただし、以前のバージョンとの互換性を維持するために、互換性フラグが導入されました。下位互換性オプションの詳細については、アップグレードガイド を参照してください。このオプションを使用すると、アプリケーションは引き続き URL パラメーターの古い形式を使用できます。
URL パラメーターは互換性を持つように構成できるようになりましたが、Keycloak 17 以前のリリースとの間にまだ 1 つの非互換性がありました。ユーザーが有効な idTokenHint
を提供しない場合、ログアウトのリダイレクトが成功する代わりにログアウトプロンプトが表示されます。そのため、ログアウト画面を抑制するための新しい互換性フラグ suppress-logout-confirmation-screen
が導入されました。
サーバーを起動するときに、次のコマンドを入力してこのパラメーターを有効にできます。
bin/kc.[sh|bat] --spi-login-protocol-openid-connect-suppress-logout-confirmation-screen=true start
この構成により、ユーザープロンプトなしでログアウトエンドポイントを引き続き使用できます。
下位互換性スイッチは、将来のバージョン (おそらく Keycloak 23) で削除されます。このスイッチに依存するのではなく、上記のようにできるだけ早くクライアントを更新することをお勧めします。 |
SAML javascript プロトコルマッパーを介したスクリプトのデプロイ
これまで、SAML クライアントまたはクライアントスコープで SAML javascript プロトコルマッパーを使用していた管理者は、Keycloak 管理コンソールおよび RESTful Admin API を介してサーバーにスクリプトをアップロードすることが許可されていました。
当面の間、この機能は 無効 になり、ユーザーはスクリプトをサーバーに直接デプロイする必要があります。この動作は、他のスクリプトベースのプロバイダーと一致しています。詳細については、JavaScript プロバイダー を参照してください。
UserInfo エンドポイントの変更
- エラーレスポンスの変更
-
UserInfo エンドポイントは、RFC 6750 (OAuth 2.0 認可フレームワーク: ベアラートークンの使用法) に完全に準拠したエラーレスポンスを返すようになりました。エラーコードと説明 (利用可能な場合) は、JSON オブジェクトフィールドではなく、
WWW-Authenticate
チャレンジ属性として提供されます。レスポンスは、エラー状態に応じて次のようになります。-
アクセストークンが提供されない場合
401 Unauthorized WWW-Authenticate: Bearer realm="myrealm"
-
アクセストークンを提供するために複数のメソッドが同時に使用されている場合 (たとえば、Authorization ヘッダー + POST access_token パラメーター)、または POST パラメーターが重複している場合
400 Bad Request WWW-Authenticate: Bearer realm="myrealm", error="invalid_request", error_description="..."
-
アクセストークンに
openid
スコープがない場合403 Forbidden WWW-Authenticate: Bearer realm="myrealm", error="insufficient_scope", error_description="Missing openid scope"
-
UserInfo レスポンスの署名/暗号化のための暗号化キーを解決できない場合
500 Internal Server Error
-
トークン検証エラーの場合、
401 Unauthorized
がinvalid_token
エラーコードと組み合わせて返されます。このエラーには、ユーザーおよびクライアント関連のチェックが含まれており、実際には残りのすべてのエラーケースをキャプチャします。401 Unauthorized WWW-Authenticate: Bearer realm="myrealm", error="invalid_token", error_description="..."
-
- その他の変更
-
-
UserInfo は OpenID Connect に固有の機能であり、OAuth 2.0 に固有の機能ではないため、アクセストークンには
openid
スコープが必要です。トークンにopenid
スコープがない場合、リクエストは403 Forbidden
で拒否されます (上記参照)。 -
UserInfo はユーザーのステータスをチェックし、ユーザーが無効になっている場合は
invalid_token
レスポンスを返します。
-
19.0.0 への移行
新しい管理コンソールがデフォルトのコンソールになりました
新しい管理コンソールが Keycloak のデフォルトコンソールになりました。新しい管理コンソールの使用を開始できない場合は、たとえば次を実行して、新しいコンソールを無効にすることで、古い管理コンソールを引き続き使用できます。
bin/kc.sh start-dev --features-disabled=admin2
古い管理コンソールを引き続き使用する別の方法として、マスターレルムまたは他のレルムのテーマを keycloak
に設定する方法があります。
新しい管理コンソールは古い管理コンソールとは大幅に異なり、React ベースで、新しいバージョンの PatternFly を使用しているため、カスタムテーマはほとんどの場合、最初から再実装する必要があります。新しい管理コンソール用のカスタムテーマを作成するには、テーマは keycloak
ではなく keycloak.v2
を拡張する必要があります。
マスターレルムまたは他のレルムの管理コンソールテーマを keycloak
に明示的に設定している場合、古い管理コンソールを引き続き使用します。新しい管理コンソールに更新するには、テーマを keycloak.v2
に変更する必要があります。
古い管理コンソールは Keycloak 21 で削除されます。
サーバー構成と起動の変更
このリリースより前は、サーバーを起動する前にビルドオプションが変更された場合に、条件付きで build
を実行するようにサーバーに指示するために、start
コマンドを実行するときに --auto-build
を使用していました。
このリリースでは、--auto-build
フラグは 非推奨 となり、サーバーを起動するときにビルドオプションを設定することを示すために使用する必要はなくなりました。代わりに、ビルドオプションが変更された場合、サーバーはサーバーを起動する前に常にデフォルトで build
を実行するようになります。新しい動作は、最高の起動時間とメモリフットプリントを実現するために、build
コマンドを事前に実行することがオプションですが、強く推奨されるようになり、サーバーの構成と起動時の全体的なエクスペリエンスを向上させます。
最高の起動時間とメモリフットプリントを実現するには、新しいデフォルトの動作を無効にするために --optimized
オプションを設定してください。--optimized
フラグは、起動の一部として直接 build
をチェックして実行する必要がないことをサーバーに指示します。
kc.sh start --optimized
カスタムイメージをすでに使用してビルドオプションを設定し、最適化された Keycloak コンテナを実行している場合は、start
コマンドを呼び出すときに --optimized
オプションを設定していることを確認してください。
ヘルスエンドポイントへの互換性を損なう可能性のある変更
Keycloak 19.0.0 より前は、Quarkus ベースの Keycloak ディストリビューションは、意図せずに次の非アプリケーションエンドポイントを常に有効にしていました。
-
/q/health
-
/q/health/live
-
/q/health/ready
-
/q/metrics
Keycloak 19.0.0 以降では、これらのエンドポイントは 無効 になり、リクエストは 404 HTTP ステータスコードになります。/q/…
エンドポイントを使用している場合は、Keycloak 19.0.0 にアップグレードするときに、意図されたヘルスエンドポイントを使用するようにプローブと監視システムを変更してください。
意図されたヘルスエンドポイントは次のとおりです。
-
/health
-
/health/live
-
/health/ready
-
/metrics
/q/ エンドポイントを無効にする以外に、ヘルスエンドポイントに対して行われたその他の改善点は次のとおりです。
-
ライブネスプローブに使用される
health/live
エンドポイントは、現在のベストプラクティスに合わせて、データベース接続のヘルスから分離され、health/ready
エンドポイントと同じ動作をしないようにされました。その結果、/health/live
を呼び出すときに、データベースチェックはchecks:
配列に表示されなくなり、データベースの不調が発生した場合でも、ライブネスプローブは引き続き HTTP ステータスコード 200 と UP のステータスを返すため、ポッドの再起動はトリガーされない可能性があります。 -
準備プローブに使用される
health/ready
エンドポイントは、引き続きデータベース接続が機能しているかどうかを確認します。構成でhealth-enabled=true
だけでなくmetrics-enabled=true
も設定して、データベースチェックを有効にし、効果的な準備プローブになるようにしてください。データベース接続が正常な状態でない場合は、HTTP ステータスコード 503 と DOWN のステータスを返します。
この領域では、今後さらに機能強化が期待されます。詳細については、ヘルスガイド を参照してください。
GELF / 集中ログ管理を使用する変更
リリースノートに記載されているように、Keycloak は GELF ロギングを標準でサポートするようになりました。
以前のバージョンで GELF 関連の Quarkus JAR を自分で追加した場合、ロギングガイド のサポートされている構成オプションに切り替え、providers
フォルダーから JAR を削除してください。
開発者に影響を与える変更
Keycloak は大規模なリファクタリングを行っており、既存のコードに影響を与えます。これらの変更の一部では、既存のコードの更新が必要です。これらについては、以下で詳しく説明します。
変更の理由
Keycloak には、Keycloak クラスターのアップグレードにダウンタイムが必要になるなど、いくつかの制限があります。これらの制限に対処するために、詳細なリファクタリングが開始されました。
このバージョンの変更は、主にストレージのリファクタリングと、マップストレージと呼ばれる新しいストレージの準備に関連しています。このストレージは最終的に現在のストレージに置き換わり、このバージョンでは レガシーストア と呼ばれます。レガシーストアは、Keycloak でさらにいくつかのバージョンで引き続き利用できます。
新しいストアでは、サービス層とストレージ層間の責任の厳密な分離が課せられます。そのため、オブジェクトのオリジンに対するサービス層の可視性が制限され、キャッシュされたオブジェクトとキャッシュされていないオブジェクト、またはローカルストレージまたはフェデレーションストレージから発信されたオブジェクトを区別できなくなります。
ユーザーストレージ SPI は非推奨になります。さらにいくつかのバージョンでサポートされますが、最終的にはマップストレージ SPI に置き換えられます。マップストレージ SPI は、ユーザー、ロール、クライアント、グループなど、認識された任意の領域のカスタムストレージを作成する機能を提供します。
レガシーストアのサービスで利用可能な詳細レベルに依存する拡張機能は、レガシーストアの完全な非推奨期間中、この機能を保持するために調整が必要になります。次のセクションでは、その調整がどのように行われるかについて説明します。
レガシー ストアとマップ ストアの使用は相互に排他的です。一方のストアがアクティブな間は、もう一方のストアを使用できません。
モジュール構造の変更
新しいストレージ機能の導入の一環として、KeycloakSession
のストレージ機能に関するいくつかのパブリック API が統合され、一部は非推奨となり、次のバージョンのいずれかで削除される予定です。3 つの新しいモジュールが導入され、server-spi
、server-spi-private
、および services
モジュールのデータ指向コードがそこに移動されました。
org.keycloak:keycloak-model-legacy
-
ユーザーストレージ API など、レガシーストアからのすべてのパブリックに公開される API が含まれています。
org.keycloak:keycloak-model-legacy-private
-
ストレージ
*Manager
クラスなど、ユーザーストレージ管理に関連するプライベート実装が含まれています。 org.keycloak:keycloak-model-legacy-services
-
レガシーストアで直接動作し、新しいストアでは意味のないすべての REST エンドポイントが含まれています。
これらのモジュールは、レガシーストアがサポートされている限り利用できます。その期間が過ぎると、削除されます。
この変更は、Wildfly ディストリビューションでの既存のユーザーストレージプロバイダーのデプロイに影響を与えます。ユーザーストレージプロバイダーが WAR アーカイブとしてデプロイされている場合は、変更された依存関係を示す META-INF/jboss-deployment-structure.xml
ファイルをそのアーカイブに追加する必要があります。以下に示します。
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.2">
<deployment>
<dependencies>
<module name="org.keycloak.keycloak-model-legacy" meta-inf="import"/>
</dependencies>
</deployment>
</jboss-deployment-structure>
KeycloakSession
の変更
KeycloakSession
が簡素化されました。KeycloakSession
でいくつかのメソッドが非推奨となり、将来のバージョンで削除される予定です。
KeycloakSession
セッションには、UserProvider
などの特定のオブジェクトタイプのプロバイダーを取得するためのいくつかのメソッドが含まれています。users()
、userLocalStorage()
、userCache()
、userStorageManager()
、および userFederatedStorage()
があります。この状況は、各メソッドの正確な意味を理解する必要があり、現在のストアレイアウトに依存する開発者にとって混乱を招く可能性があります。新しいストアは、フェデレーションストレージとローカルストレージを区別しません。
これらの理由から、users()
メソッドのみが KeycloakSession
に保持され、上記の他のすべての呼び出しを置き換える必要があります。残りのメソッドは非推奨となり、最終的には削除されます。非推奨の同じパターンは、clients()
や groups()
などの他のオブジェクト領域のメソッドにも適用されます。*StorageManager()
および *LocalStorage()
で終わるすべてのメソッドは、新しいストアに直接の代替手段がないため、呼び出されると例外をスローします。次のセクションでは、これらの呼び出しを新しい API に移行する方法、または古いストアを使用しながらレガシー API を使用する方法について説明します。
KeycloakSession の非推奨メソッドは、将来のリリースで削除されます。keycloak-model-legacy-*
モジュールは、より長い期間利用可能になり、最終的には削除されます。
レガシーストアに依存しない既存のプロバイダーの移行
ほとんどのプロバイダーに当てはまるはずですが、既存のプロバイダーは、非推奨のメソッドを呼び出さない場合、移行する必要はありません。
プロバイダーが非推奨のメソッドを使用しているが、ローカルストレージと非ローカルストレージに依存していない場合は、非推奨となった userLocalStorage()
からメソッド users()
への呼び出しを変更するのが最良のオプションです。新しいメソッドは、ローカルセットアップでキャッシュが有効になっている場合にキャッシュが含まれるため、ここでセマンティクスが変更されることに注意してください。
session.userLocalStorage();
session.users();
レガシーストアに依存する既存のプロバイダーの移行
カスタムプロバイダーが特定のプロバイダーのモードを区別する必要があるまれなケースでは、非推奨となったオブジェクトへのアクセスは、LegacyStoreManagers
データストアプロバイダーを使用することで提供されます。このオプションは、レガシーモジュールがデプロイメントの一部である場合にのみ利用可能です。
session.userLocalStorage();
((LegacyDatastoreProvider) session.getProvider(DatastoreProvider.class)).userLocalStorage();
一部のユーザーストレージ関連 API は、利便性のために org.keycloak.storage.UserStorageUtil
にラップされています。
RealmModel
の変更
メソッド getUserStorageProviders
、getUserStorageProvidersStream
、getClientStorageProviders
、getClientStorageProvidersStream
、getRoleStorageProviders
、および getRoleStorageProvidersStream
が削除されました。これらのメソッドに依存し、レガシーストレージが有効になっている状態で実行されるコードは、インスタンスを次のようにキャストする必要があります。
realm.getClientStorageProvidersStream()...;
((LegacyRealmModel) realm).getClientStorageProvidersStream()...;
同様に、インターフェース RealmModel
を実装し、これらのメソッドを提供したいコードは、新しいインターフェース LegacyRealmModel
を実装する必要があります。このインターフェースは RealmModel
のサブインターフェースであり、古いメソッドを含んでいます。
public class MyClass extends RealmModel {
/* might not compile due to @Override annotations for methods no longer present
in the interface RealmModel. /
/ ... */
}
public class MyClass extends LegacyRealmModel {
/* ... */
}
インターフェース UserCache
がレガシーモジュールに移動
オブジェクトのキャッシュステータスはサービスに対して透過的になるため、インターフェース UserCache
はモジュール keycloak-legacy
に移動されました。したがって、session.userCache()
の呼び出しは UserProvider
のみを返すようになり、これは破壊的な変更です。
レガシー実装に依存するコードは、UserCache
に直接アクセスする必要があります。レガシーストアを使用したキャッシュが使用されている間は、そのような呼び出しが必要になる可能性がありますが、新しいマップストアを使用する場合は、キャッシュを透過的に処理するため、必要ありません。
// session.userCache() might return null, null-check omitted for brevity.
session.userCache().evict(realm, user);
// session.getProvider(UserCache.class) might return null, null-check omitted for brevity.
session.getProvider(UserCache.class).evict(realm, user);
レルムの無効化をトリガーするには、UserCache
API を使用する代わりに、イベントのトリガーを検討してください。
UserCache cache = session.getProvider(UserCache.class);
if (cache != null) cache.clear();
session.invalidate(InvalidationHandler.ObjectType.REALM, realm.getId());
ユーザーのクレデンシャル管理
ユーザーのクレデンシャルは、以前は session.userCredentialManager().method(realm, user, ...)
を使用して管理されていました。新しい方法は、user.credentialManager().method(...)
を活用することです。この形式は、クレデンシャル機能をユーザーの API に近づけ、レルムとストレージに関するユーザーのクレデンシャルの場所に関する事前の知識に依存しません。
古い API は非推奨となり、レガシーストレージがデプロイメントで有効になっている場合にのみ機能します。新しい API は、古いストレージと新しいストレージの両方で機能します。
session.userCredentialManager().createCredential(realm, user, credentialModel)
user.credentialManager().createStoredCredential(credentialModel)
カスタム UserStorageProvider
の場合、UserModel
を返すときに実装する必要がある新しいメソッド credentialManager()
があります。これらのプロバイダーは、レガシーストレージが有効になっている環境で実行されるため、LegacyUserCredentialManager
のインスタンスを返す必要があります。
UserModel
で必要な新しいメソッド credentialManager()
によりコードがコンパイルされませんpublic class MyUserStorageProvider implements UserLookupProvider, ... {
/* ... */
protected UserModel createAdapter(RealmModel realm, String username) {
return new AbstractUserAdapter(session, realm, model) {
@Override
public String getUsername() {
return username;
}
};
}
}
UserModel.credentialManager()
の実装。public class MyUserStorageProvider implements UserLookupProvider, ... {
/* ... */
protected UserModel createAdapter(RealmModel realm, String username) {
return new AbstractUserAdapter(session, realm, model) {
@Override
public String getUsername() {
return username;
}
@Override
public SubjectCredentialManager credentialManager() {
return new LegacyUserCredentialManager(session, realm, this);
}
};
}
}
レガシー Keycloak Operator での非推奨の podDisruptionBudget
今回のリリースでは、レガシー Keycloak Operator の Keycloak CR の podDisruptionBudget
フィールドを非推奨にしました。このオプションのフィールドは、Operator が Kubernetes バージョン 1.25 以降にデプロイされている場合、無視されます。
回避策として、Pod Disruption Budget をクラスターに手動で作成できます。例:
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
labels:
app: keycloak
name: keycloak
spec:
maxUnavailable: 1
selector:
matchLabels:
component: keycloak
Kubernetes ドキュメントも参照してください。
18.0.0 への移行
ステップアップ認証
ステップアップ認証は新機能です。この機能は、トークンに acr
クレームを追加することを目的としたプロトコルマッパーを含む acr
クライアントスコープを提供します。acr
クレームは、このバージョンより前のように自動的に追加されるのではなく、このクライアントスコープとプロトコルマッパーを使用することで追加されます。
クライアントスコープはレルムの「デフォルト」クライアントスコープとして追加されるため、新しく作成されたすべてのクライアントに追加されます。パフォーマンス上の理由から、クライアントスコープは移行中に既存のすべてのクライアントに自動的に追加されません。クライアントは、移行後、デフォルトでは acr
クレームを持ちません。以下の可能なアクションを検討してください。
-
ステップアップ認証機能を使用する予定はないが、トークン内の
acr
クレームに依存している場合は、step_up_authentication
機能を無効にすることができます。クレームは、通常の認証の場合は値1
、SSO 認証の場合は0
で追加されます。 -
管理者 REST API または管理コンソールを使用して、
acr
クライアントスコープをクライアントに手動で追加します。これは、特にステップアップ認証を使用する場合に必要です。レルムに多数のクライアントがあり、それらすべてにacr
クレームを使用したい場合は、DB に対してこれと同様の SQL をトリガーできます。ただし、Keycloak がすでに起動している場合は、キャッシュをクリアするか、サーバーを再起動することを忘れないでください。
insert into CLIENT_SCOPE_CLIENT (CLIENT_ID, SCOPE_ID, DEFAULT_SCOPE) select CLIENT.ID as CLIENT_ID, CLIENT_SCOPE.ID as SCOPE_ID, true as DEFAULT_SCOPE
from CLIENT_SCOPE, CLIENT where CLIENT_SCOPE.REALM_ID='test' and CLIENT_SCOPE.NAME='acr' and CLIENT.REALM_ID='test' and CLIENT.PROTOCOL='openid-connect';
OpenID Connect ログアウト
以前のバージョンの Keycloak では、http(s)://example-host/auth/realms/my-realm-name/protocol/openid-connect/logout?redirect_uri=encodedRedirectUri
のようなログアウトエンドポイント URL を開くことで、ユーザーの自動ログアウトとアプリケーションへのリダイレクトがサポートされていました。その実装は使いやすかったものの、パフォーマンスとセキュリティに潜在的な悪影響がありました。新しいバージョンでは、OpenID Connect RP-Initiated Logout 仕様に基づいたログアウトのサポートが向上しています。パラメーター redirect_uri
はサポートされなくなりました。また、新しいバージョンでは、ユーザーはログアウトを確認する必要があります。ログインに使用した ID トークンとともにパラメーター post_logout_redirect_uri
とパラメーター id_token_hint
を含めると、確認を省略してアプリケーションへの自動リダイレクトを実行できます。
既存のデプロイメントは、次の方法で影響を受けます。
-
アプリケーションが
redirect_uri
パラメーターを使用してログアウトエンドポイントへのリンクを直接使用している場合は、上記のようにこれを変更する必要がある場合があります。redirect_uri
パラメーターを完全に削除するか、id_token_hint
およびpost_logout_redirect_uri
パラメーターに置き換えることを検討してください。 -
Java アダプターを使用しており、アプリケーションが
httpServletRequest.logout()
を呼び出してログアウトする場合、この呼び出しはログアウトエンドポイントのバックチャネルバリアントを使用し、それは変更されていないため、影響を受けません。 -
最新の JavaScript アダプターを使用している場合も、影響を受けません。ただし、アプリケーションが古いバージョンの JavaScript アダプターを使用している場合は、このアダプターが非推奨の
redirect_uri
パラメーターを使用してログアウトエンドポイントのバリアントを使用しているため、影響を受けます。この場合、最新バージョンの JavaScript アダプターにアップグレードする必要がある場合があります。 -
Node.js アダプターの場合、JavaScript アダプターと同じガイドラインが適用されます。古いバージョンのアダプターは非推奨の
redirect_uri
パラメーターを使用しているため、最新バージョンに更新することをお勧めします。最新の Node.js アダプターを使用すると、ドキュメントまたは Node.js アダプターの例で説明されているように、/logout
URL に基づいてログアウトを使用する限り、影響を受けません。ただし、アプリケーションがメソッドkeycloak.logoutUrl
を直接使用している場合は、idTokenHint
をこのメソッドの 2 番目の引数として追加することを検討できます。idTokenHint
を 2 番目の引数として追加する可能性は、このバージョンで新しく追加されました。idTokenHint
は、ログイン中に取得された有効な ID トークンである必要があります。idTokenHint
の追加はオプションですが、省略すると、ユーザーは前述のようにログアウト画面を確認する必要があります。また、ログアウト後にアプリケーションにリダイレクトされません。
アプリケーションが redirect_uri
パラメーターの古い形式を引き続き使用できるようにする下位互換性オプションがあります。
サーバーを起動するときに、次のコマンドを入力してこのパラメーターを有効にできます。
bin/kc.[sh|bat] --spi-login-protocol-openid-connect-legacy-logout-redirect-uri=true start
この構成では、redirect_uri
パラメーターを含む形式を引き続き使用できます。id_token_hint
が省略されている場合、確認画面が必要になることに注意してください。
下位互換性スイッチは、将来のバージョン (おそらく Keycloak 23) で削除されます。このスイッチに依存するのではなく、上記のようにできるだけ早くクライアントを更新することをお勧めします。 |
upload-scripts
機能の削除
以前のバージョンの Keycloak では、管理コンソールや REST API などの管理インターフェースを介して JavaScript コードを管理することがサポートされていました。このバージョン以降、これは不可能になり、次のプロバイダーを構成するために、スクリプトをサーバーにデプロイする必要があります。
-
OpenID Connect スクリプトマッパー
-
スクリプト認証 (認証実行)
-
JavaScript ポリシー
スクリプトをサーバーにデプロイする方法の詳細については、ドキュメントを参照してください。スクリプトを使用するには、scripts
技術プレビュー機能を有効にする必要があることに注意してください。
kc.[sh|bat] start --auto-build --features=preview
スクリプトをデプロイすると、サーバーは対応するプロバイダーを自動的に作成するため、認証フロー、マッパー、および承認ポリシーを構成するときにそれらを選択できます。
一般的に、レルムを更新する手順は次のとおりです。
-
アップグレードする前に、使用しているスクリプトプロバイダーを削除します。
-
アップグレード後、ドキュメントの指示に従ってスクリプトをデプロイします。
-
認証フロー、マッパー、およびクライアント承認設定を更新して、サーバーにデプロイされたスクリプトから作成されたプロバイダーを使用します。
アカウントコンソール Patternfly アップグレード
Patternfly (PF) React ライブラリが更新され、@patternfly/react-core
が v3.153.3 から v4.147.0 に、@patternfly/react-icons
が v3.15.16 から v 4.11.8 に、@patternfly/react-styles
が v3.7.14 から v4.11.8 に更新されました。アカウントコンソールを PF デザイン標準に合わせるために、いくつかのマイナーな UI アップデートが実施されました。
カスタム開発されたアカウント UI は、PF の破壊的変更により、これらのアップデートと互換性がない可能性があります。ほとんどの破壊的変更は、PF コンポーネントの props を更新することで解決できるはずです。
リソース
-
[Patternfly ドキュメント](https://www.patternfly.org)
破壊的変更があることが判明しているコンポーネント
-
Alert
-
action
prop がactionClose
に変更されました -
Expandable
-
ExpandableSection
に名称変更 -
Title
-
size 属性が
TitleSizes
を使用するようになりました -
DataListContent
-
noPadding
がhasNoPadding
に変更されました -
Grid, Stack, Level, Gallery
-
gutter
属性がhasGutter
に変更されました -
Modal
-
サイズ制御が、例えば
isLarge
から、ModalVariant
(例えばvariant={ModalVariant.large}
) を使用するように変更されました -
Select
-
ariaLabelTypeAhead
がtypeAheadAriaLabel
に -
isExpanded
がisOpen
に -
ariaLabelledBy
がaria-labelledby
に -
DataListContent
-
noPadding
がhasNoPadding
に
Quarkus ディストリビューション: metrics-enabled オプションを health-enabled および metrics-enabled に分割
metrics-enabled
オプションは、Keycloak のメトリクスのみを有効にするようになりました。readiness および liveness ヘルスエンドポイントを有効にするには、新しいブール値オプション health-enabled
があります。これにより、これらのオプションをよりきめ細かく使用できます。例えば、オンプレミスユースケースの場合、メトリクスを有効にするが、readiness/liveness プローブを有効にしないなどです。metrics-enabled=true
が設定されていた場合と同じ動作を維持するには、Keycloak をビルドするときに health-enabled=true
も追加で設定する必要があります。
17.0.0 への移行
デフォルトディストリビューションが Quarkus で駆動されるようになりました
Keycloak のデフォルトディストリビューションは、Quarkus で駆動されるようになり、Keycloak の構成方法とカスタムプロバイダーのデプロイ方法に多くの破壊的変更がもたらされました。詳細については、Quarkus 移行ガイドを確認してください。
Keycloak の WildFly ディストリビューションは非推奨となり、サポートは 2022 年 6 月に終了します。Quarkus ディストリビューションへの移行をできるだけ早く行うことをお勧めします。ただし、レガシー WildFly ディストリビューションをしばらくの間維持する必要がある場合は、考慮すべきいくつかの変更点があります。
-
レガシーディストリビューションタグのコンテナイメージが変更されました。レガシーディストリビューションを使用するには、タグ
legacy
または17.0.0-legacy
を使用してください。 -
レガシーディストリビューションの Web サイトでのダウンロードが
keycloak-legacy-17.0.0.[zip|tar.gz]
に変更されました。
Quarkus ディストリビューションへの移行、何かの構成機能の欠落、または一般的なアイデアやフィードバックに関する問題が発生した場合は、GitHub Discussions でディスカッションを開始してください。
プレビュー Quarkus ディストリビューションからの移行
プレビュー Quarkus ディストリビューションが Keycloak 15.1.0 でリリースされてから、多くのことが変更されました。変更点について学習する理想的な方法は、新しい サーバーガイドを確認することです。要約すると、変更点は次のとおりです。
-
コンテナが
quay.io/keycloak/keycloak:latest
およびquay.io/keycloak/keycloak:17.0.0
に公開されるようになりました -
Web サイトでのダウンロード名が
keycloak-17.0.0.[zip|tar.gz]
に変更されました。 -
conf/keycloak.properties
がconf/keycloak.conf
に変更されました。これにより、構成ファイルと CLI 引数の間の構成キーが統一されます。 -
build options
とruntime configuration
の間の分離が明確になりました。 -
カスタム Quarkus 構成は
conf/quarkus.properties
を介して行われます。 -
h2-mem
およびh2-file
データベースの名前がdev-mem
およびdev-file
に変更されました。 -
機能は、機能ごとに個別の構成キーを持っていた以前のアプローチに代わって、
--features
および--features-disabled
で有効/無効にされるようになりました。 -
ランタイム構成は
kc.[sh|bat] build
に渡すことができなくなり、ビルドに永続化されなくなりました -
ロギングレベルと形式は、
--log-level
および--log-format
で構成されるようになりました。以前は、これらはサポートされていない Quarkus プロパティを使用して構成する必要がありました。
クライアントポリシーの移行: client-scopes
client-scopes 条件を含むポリシーを使用していて、JSON ドキュメントを直接編集した場合は、JSON ドキュメントの "scope" フィールド名を "scopes" に変更する必要があります。
Liquibase がバージョン 4.6.2 にアップグレードされました
Liquibase がバージョン 3.5.5 から 4.6.2 に更新されました。これには、とりわけ、いくつかのバグ修正と、ServiceLoader
を使用したカスタム拡張機能を登録する新しい方法が含まれています。
以前の Keycloak バージョンから Keycloak 17.0.0 への移行は、現在サポートされているすべてのデータベースで広範囲にテストされていますが、アップグレードガイド、特にアップグレード前に既存のデータベースをバックアップすることを厳守することの重要性を強調したいと思います。Liquibase アップグレードの結果をテストするために最善を尽くしましたが、一部のインストールでは、不明な特定の設定を使用している可能性があります。
16.0.0 への移行
WildFly 25 アップグレード
WildFly 25 は、とりわけ TLS の構成に使用されていたレガシーセキュリティサブシステムを非推奨にしました。変更量が多いため、過去に行ったような移行スクリプトを提供することはできません。
以前のバージョンの Keycloak から構成ファイルをコピーするのではなく、Keycloak 16 で提供されているデフォルトの構成ファイルから開始して、関連する変更を適用することをお勧めします。
Keycloak サブシステムの構成は、直接コピーできます。
Elytron サブシステムの詳細については、WildFly ドキュメントを参照してください。
このご不便をおかけして大変申し訳ございません。Keycloak 16 へのアップグレードがすべての人にとって非常に困難になることを理解していますが、代替アプローチを見つけることができませんでした。
指摘する価値のあることの 1 つは、Keycloak 17 で完全にサポートする予定の Quarkus ディストリビューションへの切り替えにより、Keycloak の構成とアップグレードが大幅に容易になることです。
WildFly 25 の詳細については、WildFly 25 リリースノートを参照してください。
プロキシ環境変数
Keycloak は、送信 HTTP リクエストに対して標準の HTTP_PROXY
、HTTPS_PROXY
、および NO_PROXY
環境変数を尊重するようになりました。この変更により、例えば HTTP_PROXY
変数が定義されているが、SPI 構成で明示的なプロキシマッピングが指定されていない場合、プロキシサーバーが予期せず使用される可能性があります。Keycloak がこれらの環境変数を使用しないようにするには、すべてリクエストに対して .*;NO_PROXY
としてプロキシルートなしを明示的に作成できます。
13.0.0 への移行
手動移行ステップが必要
standalone.xml に SmallRye モジュールへの参照が含まれている場合、手動での変更が必要です。SmallRye モジュールは、基盤となる WildFly ディストリビューションから削除され、構成がそれらを参照している場合、サーバーは起動しません。したがって、standalone.xml
の構成がこれらのモジュールを参照している場合、migrate-standalone.cli
によるサーバー構成の移行は、構成に変更が加えられる前に失敗します。そのような場合、サーバー構成の移行を実行するには、SmallRye モジュールを参照するすべての行を手動で削除する必要があります。デフォルト構成では、具体的には次の行を削除する必要があります。
<extension module="org.wildfly.extension.microprofile.config-smallrye"/>
<extension module="org.wildfly.extension.microprofile.health-smallrye"/>
<extension module="org.wildfly.extension.microprofile.metrics-smallrye"/>
<subsystem xmlns="urn:wildfly:microprofile-config-smallrye:1.0"/>
<subsystem xmlns="urn:wildfly:microprofile-health-smallrye:2.0" security-enabled="false" empty-liveness-checks-status="${env.MP_HEALTH_EMPTY_LIVENESS_CHECKS_STATUS:UP}" empty-readiness-checks-status="${env.MP_HEALTH_EMPTY_READINESS_CHECKS_STATUS:UP}"/>
<subsystem xmlns="urn:wildfly:microprofile-metrics-smallrye:2.0" security-enabled="false" exposed-subsystems="*" prefix="${wildfly.metrics.prefix:wildfly}"/>
Wildfly 23 へのアップグレード
Keycloak サーバーは、基盤となるコンテナとして Wildfly 23 を使用するようにアップグレードされました。これは、特定の Keycloak サーバー機能に直接関係するものではありませんが、移行に関連するこれらの変更に注意してください。
- 依存関係の更新
-
依存関係は、Wildfly 23 サーバーで使用されるバージョンに更新されました。例えば、Infinispan は現在
11.0.9.Final
です。 - 構成の変更
-
standalone(-ha).xml
およびdomain.xml
ファイルにいくつかの構成変更が存在します。Keycloak サーバーのダウンロード セクションに従って、構成ファイルの移行を自動的に処理する必要があります。ただし、独自の構成変更を行った場合に必要になる可能性のある最も重要な変更を次に示します。-
Infinispan キャッシュコンテナの
module
属性は、現在非推奨 (未使用) であり、このキャッシュコンテナの構成に関連付けられたモジュールのセットを表すmodules
属性に置き換えられました。さらに、基盤となるコンテナとして Wildfly 23 を使用することに起因する、さまざまな要素の属性にも追加の変更がありました。例えば、managed-executor-service
およびmanaged-scheduled-executor-service
要素は、新しいhung-task-termination-period
属性を認識するようになりました。詳細については、Wildfly 23 フルモデルリファレンスを参照してください。
-
Wildfly 22 へのアップグレード
Keycloak サーバーは、基盤となるコンテナとして Wildfly 22 を使用するようにアップグレードされました。これは、特定の Keycloak サーバー機能に直接関係するものではありませんが、移行に関連するこれらの変更に注意してください。
- 依存関係の更新
-
依存関係は、Wildfly 22 サーバーで使用されるバージョンに更新されました。例えば、Infinispan は現在
11.0.8.Final
です。 - 構成の変更
-
standalone(-ha).xml
およびdomain.xml
ファイルにいくつかの構成変更が存在します。Keycloak サーバーのダウンロード セクションに従って、構成ファイルの移行を自動的に処理する必要があります。ただし、独自の構成変更を行った場合に必要になる可能性のある最も重要な変更を次に示します。-
Eclipse MicroProfile Config、Eclipse MicroProfile Health、および Eclipse MicroProfile Metrics サブシステムは、ヘルス用の WildFly サブシステムと ベースメトリクス用の WildFly サブシステムに置き換えられました。
-
デフォルトの Wildfly 構成は、Elytron で自動生成された自己署名証明書を利用する機能を使用するようになりました。詳細については、専用の
applicationSSC
サーバー SSL コンテキストセクションを参照してください。
-
12.0.2 への移行
読み取り専用属性
読み取り専用のユーザー属性のサポートが追加されました。これには、REST API または Keycloak ユーザーインターフェースでユーザーを更新するときに、ユーザーまたは管理者によって編集されないはずのユーザー属性が含まれます。特に次を使用する場合は重要になる可能性があります。
-
カスタムユーザーストレージプロバイダー
-
カスタム認証
-
一部のユーザー属性に基づいて承認を確立するカスタム JavaScript 承認ポリシー
-
X.509 証明書をユーザー ID にマッピングするためのカスタム属性を持つ X.509 認証
-
ユーザー属性の一部が、単純なユーザープロファイル情報ではなく、認証/承認/ID コンテキストを格納するためのメタデータとして使用されるその他のカスタム機能。
詳細については、脅威モデルの軽減に関する章を参照してください。
有効なリクエスト URI
OpenID Connect パラメーター request_uri
を使用する場合、クライアントが Valid Request URIs
を構成する必要があるという要件が存在します。これは、管理コンソールのクライアント詳細ページ、または管理 REST API またはクライアント登録 API を介して構成できます。有効なリクエスト URI には、特定のクライアントで許可されているリクエスト URI 値のリストを含める必要があります。これは、SSRF 攻撃を回避するためです。Valid Redirect URIs
オプションと同様に、ワイルドカードまたは相対パスを使用する可能性がありますが、セキュリティ上の理由から、可能な限り具体的な値を使用することを通常はお勧めします。
13.0.0 への移行
Wildfly 22 へのアップグレード
Keycloak サーバーは、基盤となるコンテナとして Wildfly 22 を使用するようにアップグレードされました。これは、特定の Keycloak サーバー機能に直接関係するものではありませんが、移行に関連するいくつかの変更点があり、言及する価値があります。
- 依存関係の更新
-
依存関係は、Wildfly 22 サーバーで使用されるバージョンに更新されました。例えば、Infinispan は現在
11.0.8.Final
です。 - 構成の変更
-
standalone(-ha).xml
およびdomain.xml
ファイルにいくつかの構成変更が存在します。Keycloak サーバーのダウンロード セクションに従って、構成ファイルの移行を自動的に処理する必要があります。例えば、独自の構成変更を行ったため、詳細が必要な場合は、最も重要な変更のリストを次に示します。-
Eclipse MicroProfile Config、Eclipse MicroProfile Health、および Eclipse MicroProfile Metrics サブシステムは、ヘルス用の WildFly サブシステムと ベースメトリクス用の WildFly サブシステムに置き換えられました。
-
デフォルトの Wildfly 構成は、Elytron で自動生成された自己署名証明書を利用する機能を使用するようになりました。詳細については、専用の
applicationSSC
サーバー SSL コンテキストセクションを参照してください。
-
12.0.0 への移行
Wildfly 21 へのアップグレード
Keycloak サーバーは、基盤となるコンテナとして Wildfly 21 を使用するようにアップグレードされました。これは、特定の Keycloak サーバー機能に直接関係するものではありませんが、移行に関連するこれらの変更に注意してください。
- 依存関係の更新
-
依存関係は、Wildfly 21 サーバーで使用されるバージョンに更新されました。例えば、Infinispan は現在 11.0.4.Final です。
- 構成の変更
-
standalone(-ha).xml
およびdomain.xml
ファイルにいくつかの構成変更が存在します。Keycloak サーバーのダウンロード セクションに従って、構成ファイルの移行を自動的に処理する必要があります。ただし、独自の構成変更を行った場合に必要になる可能性のある最も重要な変更を次に示します。-
Infinispan キャッシュの
object-memory
要素は、現在非推奨 (未使用) であり、heap-memory
要素に置き換えられました。
-
Docker プロトコル認証のユーザーセッションの作成をスキップ
Docker プロトコルでの認証が成功した後、ユーザーセッションは作成されません。詳細については、サーバー管理ガイドを参照してください。
PatternFly 4 へのアップグレード
Keycloak ログインテーマコンポーネントが PatternFly 4 にアップグレードされました。古い PatternFly 3 は新しいものと同時に実行されるため、PF3 コンポーネントを保持することは可能です。ただし、ログインテーマのデザインにいくつかの変更が加えられました。それらにより、カスタムログインテーマをアップグレードしてください。必要な変更を含む例は、keycloak/examples/themes/theme/sunrise
ディレクトリにあります。追加のセットアップは必要ありません。
デフォルトでリフレッシュトークンなしのクライアントクレデンシャルグラント
この Keycloak バージョン以降、OAuth2 クライアントクレデンシャルグラントエンドポイントは、デフォルトでリフレッシュトークンを発行しません。この動作は、OAuth2 仕様に準拠しています。この変更の副作用として、クライアントクレデンシャル認証が成功した後、Keycloak サーバー側でユーザーセッションが作成されなくなり、パフォーマンスとメモリ消費が向上します。クライアントクレデンシャルグラントを使用するクライアントは、リフレッシュトークンの使用を停止し、refresh_token
をグラントタイプとして使用する代わりに、grant_type=client_credentials
でリクエストごとに常に認証することをお勧めします。これに関連して、Keycloak は OAuth2 失効エンドポイントでのアクセストークンの失効をサポートしているため、クライアントは必要に応じて個々のアクセストークンを失効させることができます。
後方互換性のため、古いバージョンの動作に固執する可能性が存在します。これを使用すると、クライアントクレデンシャルグラントによる認証が成功した後でもリフレッシュトークンが発行され、ユーザーセッションも作成されます。これは、Keycloak管理コンソールの特定クライアントの設定で、OpenID Connect Compatibility Modes
セクションのUse Refresh Tokens For Client Credentials Grant
スイッチで有効にできます。
11.0.0への移行
WildFly 20へのアップグレード
Keycloakサーバーは、基盤となるコンテナとしてWildFly 20を使用するようにアップグレードされました。これはKeycloakサーバーの特定の機能に直接的な影響はありませんが、移行に関連する以下の変更点に注意してください。
- 依存関係の更新
-
依存関係は、WildFly 20サーバーで使用されているバージョンに更新されました。たとえば、Infinispanは現在10.1.8.Finalです。
- 構成の変更
-
standalone(-ha).xml
ファイルとdomain.xml
ファイルにいくつかの設定変更があります。Keycloakサーバーのダウンロードセクションに従って、設定ファイルの移行を自動的に処理する必要があります。 - クロスデータセンターレプリケーションの変更
-
-
Infinispanサーバーをバージョン9.4.19にアップグレードする必要があります。古いバージョンでも動作する可能性がありますが、もはやテストされていないため保証されません。
-
Infinispanキャッシュを設定する際に、
remote-store
要素に追加されたprotocolVersion
プロパティを使用することを推奨します。Infinispanサーバー9.4.18に接続する場合、Hot Rodプロトコルの推奨バージョンは2.9です。これは、KeycloakサーバーとInfinispanサーバー間でInfinispanライブラリのバージョンが異なるためです。詳細については、クロスデータセンターのドキュメントを参照してください。 -
connectionsInfinispan
サブシステムの下でremoteStoreSecurityEnabled
プロパティを使用することを推奨します。詳細については、クロスデータセンターのドキュメントを参照してください。
-
LDAPインポートなしのバグ修正
以前のKeycloakバージョンでは、LDAPプロバイダーがImport Users
OFFで設定されている場合、LDAPにマッピングされていない属性が変更されてもユーザーを更新することが可能でした。この状況では、属性が更新されたように見えても実際には更新されていないという、紛らわしい動作が発生していました。現在のバージョンでは、LDAPにマッピングされていない属性が変更された場合、更新は一切許可されません。
これはほとんどのデプロイメントには影響しないはずですが、まれな状況下では影響を受ける可能性があります。たとえば、以前に管理者REST APIを使用してユーザーを更新しようとした際に、ユーザーに誤った属性変更があった場合でも、更新は可能でした。現在のバージョンでは、更新は不可能になり、その理由がすぐに通知されます。
UserModelの変更
UserModel
のフィールドであるusername
、email
、firstName
、およびlastName
は、今後のバージョンでKeycloakにさらに洗練されたユーザープロファイルを追加するための準備として、カスタム属性に移行されました。データベースにそれらの正確な名前のカスタム属性を持つユーザーが含まれている場合、アップグレードする前にカスタム属性を移行する必要があります。この移行は自動的には行われません。そうしないと、それらはデータベースから読み取られなくなり、削除される可能性があります。この状況は、username
がUserModel.getFirstAttribute(UserModel.USERNAME)
を介してアクセスおよび設定できるようになったことも意味します。他のフィールドにも同様の影響があります。UserModel
を直接的または間接的にサブクラス化するSPIの実装者は、setUsername
とsetSingleAttribute(UserModel.USERNAME, …)
(および他のフィールドについても同様)の間の動作が一貫していることを確認する必要があります。ポリシー評価機能のユーザーは、すべてのユーザーがデフォルトで4つの新しい属性を持つようになるため、属性の数を使用する評価を行う場合はポリシーを適合させる必要があります。
UserModel
のパブリックAPIは変更されていません。フロントエンドリソースまたはユーザーデータにアクセスするSPIへの変更は必要ありません。また、データベースもまだ変更されていません。
Instagram IdPが新しいAPIに移行
Instagram IdPは、古いレガシーAPIが非推奨になったため、新しいAPIを使用するようになりました。これには、新しいAPIクレデンシャルを取得する必要があります。詳細については、サーバー管理ガイドを参照してください。
Instagram IdPを使用する既存ユーザー、特にそれが唯一の認証オプションであるユーザーは特別な注意が必要です。そのようなユーザーは、2020年9月30日までにInstagram IdPを使用してKeycloakにログインする必要があります。その日以降は、Instagramソーシャルリンクを手動で更新するか、Keycloakで新しいアカウントを作成するために、別の認証方法(パスワードなど)を使用する必要があります。これは、InstagramユーザーIDが古いAPIと新しいAPIの間で互換性がないためですが、新しいAPIは移行を可能にするために一時的に新旧両方のユーザーIDを返します。Keycloakは、ユーザーがログインするとIDを自動的に移行します。
非標準のトークンイントロスペクションエンドポイントの削除
以前のバージョンでは、Keycloakは2つのイントロスペクションエンドポイント、token_introspection_endpoint
とintrospection_endpoint
をアドバタイズしていました。後者はRFC-8414で定義されているものです。前者は以前に非推奨となり、現在は削除されました。
9.0.1への移行
JavaScriptアダプターのレガシーPromise
JavaScriptアダプターでpromiseTypeを設定する必要がなくなり、両方が同時に利用可能になりました。レガシーAPI(success
とerror
)は将来のある時点で削除されるため、ネイティブPromise API(then
とcatch
)を使用するようにアプリケーションをできるだけ早く更新することを推奨します。
トップレベルグループの重複
バージョン9.0.1では、レルム内に重複したトップレベルグループを作成する可能性のある問題が修正されました。それにもかかわらず、以前の重複グループの存在はアップグレードプロセスを失敗させます。Keycloakサーバーは、H2、MariaDB、MySQL、またはPostgreSQLデータベースを使用している場合にこの問題の影響を受ける可能性があります。アップグレードを開始する前に、サーバーに重複したトップレベルグループが含まれているか確認してください。たとえば、次のSQLクエリをデータベースレベルで実行してリストできます。
SELECT REALM_ID, NAME, COUNT(*) FROM KEYCLOAK_GROUP WHERE PARENT_GROUP is NULL GROUP BY REALM_ID, NAME HAVING COUNT(*) > 1;
各レルムに同じ名前のトップレベルグループは1つしか存在できません。重複は確認し、アップグレード前に削除する必要があります。アップグレードのエラーには、Change Set META-INF/jpa-changelog-9.0.1.xml::9.0.1- KEYCLOAK-12579-add-not-null-constraint::keycloak failed.
というメッセージが含まれています。
9.0.0への移行
ユーザーロケールの処理の改善
ログインページのロケールの選択方法、およびユーザーのロケールが更新されるタイミングに関して、多くの改善が行われました。
詳細については、サーバー管理ガイドを参照してください。
8.0.2への移行
認証フローのさらなる変更
- 同じフローでREQUIREDとALTERNATIVEの実行はサポートされなくなりました
-
以前のバージョンでは、同じ認証フローの同じレベルでREQUIREDとALTERNATIVEの実行を持つことが可能でした。このアプローチにはいくつかの問題があり、認証SPIでリファクタリングを行ったため、これはもはや有効とは見なされません。ALTERNATIVEとREQUIREDの実行が同じレベルで設定されている場合、ALTERNATIVEの実行は無効と見なされます。したがって、最新バージョンに移行する際、既存の認証フローは、以前のバージョンに存在していた動作と同じ動作を維持するように自動的に移行されます。それらにREQUIRED実行と同じレベルでALTERNATIVE実行が含まれている場合、ALTERNATIVE実行は個別のREQUIREDサブフローに追加されます。これにより、特定の認証フローの動作が以前のバージョンと同じまたは類似していることが保証されるはずです。認証フローの設定を再確認し、すべてが期待どおりに動作することを確認するためにテストすることを常に推奨します。この推奨事項は、特にカスタム認証機構の実装を含む、よりカスタマイズされた認証フローがある場合に当てはまります。
8.0.0への移行
新しいデフォルトホスト名プロバイダー
古いリクエストおよび固定ホスト名プロバイダーは、新しいデフォルトホスト名プロバイダーに置き換えられました。リクエストおよび固定ホスト名プロバイダーは非推奨となり、できるだけ早くデフォルトホスト名プロバイダーに切り替えることを推奨します。
WildFly 18へのアップグレード
Keycloakサーバーは、基盤となるコンテナとしてWildFly 18を使用するようにアップグレードされました。これはKeycloakサーバーの特定の機能に直接的な影響はありませんが、移行に関連する以下の変更点に注意してください。
- 依存関係の更新
-
依存関係は、WildFly 18サーバーで使用されているバージョンに更新されました。たとえば、Infinispanは現在9.4.16.Finalです。
- 構成の変更
-
standalone(-ha).xml
ファイルとdomain.xml
ファイルにいくつかの設定変更があります。Keycloakサーバーのダウンロードセクションに従って、設定ファイルの移行を自動的に処理する必要があります。 - クロスデータセンターレプリケーションの変更
-
-
Infinispanサーバーをバージョン9.4.19にアップグレードする必要があります。古いバージョンでも動作する可能性がありますが、もはやテストされていないため保証されません。
-
サーバーへのスクリプトのデプロイ
これまで、管理者はKeycloak管理コンソールおよびRESTful Admin APIを通じてサーバーにスクリプトをアップロードすることが許可されていました。
当面の間、この機能はデフォルトで無効になっており、ユーザーはスクリプトをサーバーに直接デプロイすることを推奨します。詳細については、JavaScriptプロバイダーを参照してください。
JavaScriptアダプターのクライアントクレデンシャル
以前のリリースでは、開発者はJavaScriptアダプターにクライアントクレデンシャルを提供することが許可されていました。当面の間、クライアント側のアプリはシークレットを安全に保持できないため、この機能は削除されました。
認証フローの変更
認証フローに関連するリファクタリングと改善を行いました。移行中に注意が必要です。
- OPTIONAL実行要件の削除
-
移行に関して最も重要な変更は、認証実行からOPTIONAL要件のサポートを削除し、より柔軟性の高いCONDITIONAL要件に置き換えたことです。以前のバージョンで設定された既存のOPTIONAL認証機構は、CONDITIONALサブフローに置き換えられます。これらのサブフローには、最初の実行として
Condition - User Configured
条件が設定され、2番目の実行として以前のOPTIONAL認証機構(たとえばOTP Form
)が設定されます。ユーザーの視点から見ると、認証中の動作は以前のバージョンと同じです。 - Java SPIの変更
-
Java Authentication SPIおよびCredential Provider SPIにいくつかの変更があります。
Authenticator
インターフェースは変更されていませんが、新しい資格情報タイプ(CredentialModel
のサブクラス)を導入する、より高度な認証機構を開発している場合は影響を受ける可能性があります。CredentialProvider
インターフェースに変更があり、CredentialValidator
のような新しいインターフェースが導入されました。また、認証機構がOPTIONAL実行要件をサポートしていた場合も影響を受ける可能性があります。詳細については、サーバー開発ガイドの最新の認証機構の例を再確認することを推奨します。 - Freemarkerテンプレートの変更
-
Freemarkerテンプレートにいくつかの変更があります。ログインフォームまたはアカウントフォーム、特にOTPに関連するフォームのカスタムFreemarkerテンプレートを持つ独自のテーマがある場合は影響を受ける可能性があります。最新のKeycloakのFreemarkerテンプレートの変更を再確認し、それに応じてテンプレートを調整することを推奨します。
7.0.0への移行
WildFly 17へのアップグレード
Keycloakサーバーは、基盤となるコンテナとしてWildFly 17を使用するようにアップグレードされました。これはKeycloakサーバーの特定の機能に直接的な影響はありませんが、移行に関連する以下の変更点に注意してください。
- 依存関係の更新
-
依存関係は、WildFly 17サーバーで使用されているバージョンに更新されました。たとえば、Infinispanは現在9.4.14.Finalです。
- 構成の変更
-
standalone(-ha).xml
ファイルとdomain.xml
ファイルにいくつかの設定変更があります。Keycloakサーバーのダウンロードセクションに従って、設定ファイルの移行を自動的に処理する必要があります。 - クロスデータセンターレプリケーションの変更
-
-
Infinispanサーバーをバージョン9.4.19にアップグレードする必要があります。古いバージョンでも動作する可能性がありますが、もはやテストされていないため保証されません。
-
6.0.0への移行
WildFly 16へのアップグレード
Keycloakサーバーは、基盤となるコンテナとしてWildFly 16を使用するようにアップグレードされました。これはKeycloakサーバーの特定の機能に直接的な影響はありませんが、移行に関連する以下の変更点に注意してください。
- 依存関係の更新
-
依存関係は、WildFly 16サーバーで使用されているバージョンに更新されました。たとえば、Infinispanは現在9.4.8.Finalです。
- 構成の変更
-
standalone(-ha).xml
ファイルとdomain.xml
ファイルにいくつかの設定変更があります。Keycloakサーバーのダウンロードセクションに従って、設定ファイルの移行を自動的に処理する必要があります。 - クロスデータセンターレプリケーションの変更
-
-
Infinispanサーバーをバージョン9.4.19にアップグレードする必要があります。古いバージョンでも動作する可能性がありますが、もはやテストされていないため保証されません。
-
新しいオプションのクライアントスコープ
MicroProfile/JWT Auth仕様で定義されているクレームを処理するために、新しいmicroprofile-jwt
オプションのクライアントスコープを追加しました。この新しいクライアントスコープは、認証されたユーザーのユーザー名をupn
クレームに設定し、レルムロールをgroups
クレームに設定するためのプロトコルマッパーを定義します。
prompt=noneをデフォルトIDPに伝播する機能
prompt=none
クエリパラメータを含む転送リクエストを処理できるIDPを識別するために、OIDCアイデンティティプロバイダー設定にAccepts prompt=none forward from client
という名前の新しいスイッチを追加しました。
これまで、prompt=none
を含む認証リクエストを受信した場合、ユーザーがIDPによって認証されているかどうかを確認せずに、レルムで認証されていない場合、レルムはlogin_required
エラーを返していました。今後は、認証リクエストのデフォルトIDPを(kc_idp_hint
クエリパラメータの使用またはレルムのデフォルトIDPの設定によって)特定でき、IDPに対してAccepts prompt=none forward from client
スイッチが有効になっている場合、ユーザーがそこで認証されているかどうかを確認するために認証リクエストがIDPに転送されます。
このスイッチは、デフォルトIDPが指定されている場合にのみ考慮されることに注意することが重要です。その場合、ユーザーにIDPを選択するように求めることなく、認証リクエストをどこに転送するかを知っています。デフォルトIDPを特定できない場合は、認証リクエストを満たすためにどのIDPが使用されるかを推測できないため、リクエスト転送は実行されません。
5.0.0への移行
WildFly 15へのアップグレード
Keycloakサーバーは、基盤となるコンテナとしてWildFly 15を使用するようにアップグレードされました。これはKeycloakサーバーの特定の機能に直接的な影響はありませんが、移行に関連する以下の変更点に注意してください。
- 依存関係の更新
-
依存関係は、WildFly 15サーバーで使用されているバージョンに更新されました。たとえば、Infinispanは現在9.4.3.Finalです。
- 構成の変更
-
standalone(-ha).xml
ファイルとdomain.xml
ファイルにいくつかの設定変更があります。Keycloakサーバーのダウンロードセクションに従って、設定ファイルの移行を自動的に処理する必要があります。 - クロスデータセンターレプリケーションの変更
-
-
Infinispanサーバーをバージョン9.4.19にアップグレードする必要があります。古いバージョンでも動作する可能性がありますが、もはやテストされていないため保証されません。
-
4.8.2への移行
GoogleアイデンティティプロバイダーがGoogle Sign-in認証システムを使用するように更新されました
バージョン4.8.1までのKeycloakのGoogleアイデンティティプロバイダーの実装は、認証とユーザープロファイルの取得にGoogle+ APIエンドポイントに依存していました。2019年3月以降、Googleは新しいGoogle Sign-in認証システムを優先してGoogle+ APIのサポートを削除しています。Keycloakアイデンティティプロバイダーは新しいエンドポイントを使用するように更新されたため、この統合を使用している場合は、Keycloakバージョン4.8.2以降にアップグレードしてください。
ディレクトリにアプリケーション識別子が見つからないというエラーが発生した場合は、Google API Consoleポータルでクライアントアプリケーションを再度登録して、新しいアプリケーションIDとシークレットを取得する必要があります。
Google+ユーザー情報エンドポイントによって提供され、Google Sign-in APIによって異なる名前で提供される非標準クレームのカスタムマッパーを調整する必要がある場合があります。利用可能なクレームに関する最新情報については、Googleドキュメントを参照してください。
LinkedInソーシャルブローカーがLinkedIn APIのバージョン2に更新されました
LinkedInの方針に従い、すべての開発者はAPIおよびOAuth 2.0のバージョン2.0に移行する必要があります。そのため、LinkedInソーシャルブローカーを更新しました。
このブローカーを使用している既存のデプロイメントでは、LinkedIn APIのバージョン2を使用してユーザーのプロファイルをフェッチする際にエラーが発生し始める可能性があります。このエラーは、ブローカーの設定に使用されるクライアントアプリケーションに付与された権限の欠如に関連している可能性があり、Profile APIへのアクセスまたは認証プロセス中の特定のOAuth2スコープのリクエストが承認されていない可能性があります。
新しく作成されたLinkedInクライアントアプリケーションであっても、クライアントが少なくともr_liteprofile
およびr_emailaddress
OAuth2スコープをリクエストできること、およびクライアントアプリケーションがhttps://api.linkedin.com/v2/me
エンドポイントから現在のメンバーのプロファイルをフェッチできることを確認する必要があります。
メンバーの情報へのアクセスに関するLinkedInによって課せられたこれらのプライバシー制限と、現在のメンバーのProfile APIによって返されるクレームの限定されたセットにより、LinkedInソーシャルブローカーはメンバーのメールアドレスをデフォルトのユーザー名として使用するようになりました。つまり、認証中に承認リクエストを送信するときに、r_emailaddress
が常に設定されるということです。
4.6.0への移行
新しいデフォルトクライアントスコープ
新しいレルムデフォルトクライアントスコープroles
とweb-origins
を追加しました。これらのクライアントスコープには、ユーザーのロールと許可されたWebオリジンをトークンに追加するプロトコルマッパーが含まれています。移行中に、これらのクライアントスコープは、すべてのOpenID Connectクライアントにデフォルトクライアントスコープとして自動的に追加されるはずです。したがって、データベースの移行が完了した後、セットアップは必要ありません。
プロトコルマッパーSPIの追加
これに関連して、(サポートされていない)プロトコルマッパーSPIに小さな追加があります。カスタムProtocolMapperを実装した場合にのみ影響を受ける可能性があります。ProtocolMapperインターフェースに新しいgetPriority()
メソッドが導入されました。このメソッドには、0を返すデフォルト実装が設定されています。プロトコルマッパーの実装がアクセストークンのrealmAccess
またはresourceAccess
プロパティのロールに依存している場合は、マッパーの優先度を上げる必要がある場合があります。
オーディエンス解決
認証されたユーザーがトークンに少なくとも1つのクライアントロールを持っているすべてのクライアントのオーディエンスが、アクセストークンのaud
クレームに自動的に追加されるようになりました。一方、アクセストークンには、発行されたフロントエンドクライアントのオーディエンスが自動的に含まれない場合があります。詳細については、サーバー管理ガイドをお読みください。
JavaScriptアダプターPromise
ネイティブJavaScript PromiseをJavaScriptアダプターで使用するには、initオプションでpromiseType
をnative
に設定する必要があります。
過去には、ネイティブPromiseが利用可能な場合、レガシーKeycloak PromiseとネイティブPromiseの両方を提供するラッパーが返されていました。これにより、ネイティブエラーイベントの前にエラーハンドラーが常に設定されているとは限らず、Uncaught (in promise)
エラーが発生するという問題が発生していました。
MicrosoftアイデンティティプロバイダーがMicrosoft Graph APIを使用するように更新されました
バージョン4.5.0までのKeycloakのMicrosoftアイデンティティプロバイダーの実装は、認証とユーザープロファイルの取得にLive SDKエンドポイントに依存していました。2018年11月以降、Microsoftは新しいMicrosoft Graph APIを優先してLive SDK APIのサポートを削除しています。Keycloakアイデンティティプロバイダーは新しいエンドポイントを使用するように更新されたため、この統合を使用している場合は、Keycloakバージョン4.6.0以降にアップグレードしてください。
"Live SDKアプリケーション"の下に登録されたレガシークライアントアプリケーションは、アプリケーションのID形式の変更により、Microsoft Graphエンドポイントでは動作しません。ディレクトリにアプリケーション識別子が見つからないというエラーが発生した場合は、Microsoft Application Registrationポータルでクライアントアプリケーションを再度登録して、新しいアプリケーションIDを取得する必要があります。
WildFly 14へのアップグレード
Keycloakサーバーは、基盤となるコンテナとしてWildFly 14を使用するようにアップグレードされました。これはKeycloakサーバーの特定の機能に直接的な影響はありませんが、移行に関連する以下の変更点に注意してください。
- 依存関係の更新
-
依存関係は、WildFly 14サーバーで使用されているバージョンに更新されました。たとえば、Infinispanは現在9.3.1.Finalです。
- 構成の変更
-
standalone(-ha).xml
ファイルとdomain.xml
ファイルにいくつかの設定変更があります。Keycloakサーバーのダウンロードセクションに従って、設定ファイルの移行を自動的に処理する必要があります。 - クロスデータセンターレプリケーションの変更
-
-
Infinispanサーバーをバージョン9.4.19にアップグレードする必要があります。古いバージョンでも動作する可能性がありますが、もはやテストされていないため保証されません。
-
4.4.0への移行
WildFly 13へのアップグレード
Keycloakサーバーは、基盤となるコンテナとしてWildFly 13を使用するようにアップグレードされました。これはKeycloakサーバーの特定の機能に直接的な影響はありませんが、移行に関連する以下の変更点に注意してください。
- 依存関係の更新
-
依存関係は、WildFly 13サーバーで使用されているバージョンに更新されました。たとえば、Infinispanは現在9.2.4.Final、Undertowは2.0.9.Finalです。
- 構成の変更
-
standalone(-ha).xml
およびdomain.xml
ファイルにいくつかの構成変更が存在します。Keycloak サーバーのダウンロード セクションに従って、構成ファイルの移行を自動的に処理する必要があります。ただし、独自の構成変更を行った場合に必要になる可能性のある最も重要な変更を次に示します。-
Infinispanキャッシュの
eviction
要素は非推奨(未使用)となり、object-memory
要素に置き換えられました。 -
Infinispanサブシステムの
cache-container
要素は、もはやjndi-attribute
を認識しません。
-
- クロスデータセンターレプリケーションの変更
-
-
Infinispanサーバーをバージョン9.4.19にアップグレードする必要があります。古いバージョンでも動作する可能性がありますが、もはやテストされていないため保証されません。
-
Infinispanサーバー設定ファイルでセキュリティを構成する必要はなくなりました。
-
Infinispanサーバー設定ファイル内のレプリケートされたキャッシュの設定から
transaction
要素を削除する必要があります。これは、Infinispanのバグhttps://issues.redhat.com/browse/ISPN-9323が原因で必要です。
-
4.0.0への移行
クライアントテンプレートがクライアントスコープに変更されました
クライアントスコープのサポートを追加しました。移行中に注意が必要です。
- クライアントテンプレートがクライアントスコープに変更されました
-
クライアントテンプレートがクライアントスコープに変更されました。クライアントテンプレートがある場合、それらのプロトコルマッパーとロールスコープマッピングは保持されます。
- 名前のスペースが置き換えられました
-
名前にスペース文字を含むクライアントテンプレートは、クライアントスコープの名前ではスペースが許可されていないため、スペースをアンダースコアに置き換えて名前が変更されました。たとえば、クライアントテンプレート
my template
はクライアントスコープmy_template
に変更されます。 - クライアントへのクライアントスコープのリンク
-
クライアントテンプレートを持っていたクライアントの場合、対応するクライアントスコープが
Default Client Scope
としてクライアントに追加されるようになりました。したがって、プロトコルマッパーとロールスコープマッピングはクライアントで保持されます。 - レルムデフォルトクライアントスコープは既存のクライアントにリンクされていません
-
移行中に、組み込みクライアントスコープのリストが各レルムに追加され、
Realm Default Client Scopes
のリストも追加されます。ただし、既存のクライアントはアップグレードされず、新しいクライアントスコープは自動的に追加されません。また、すべてのプロトコルマッパーとロールスコープマッピングは既存のクライアントに保持されます。新しいバージョンでは、新しいクライアントを作成すると、レルムデフォルトクライアントスコープが自動的にアタッチされ、プロトコルマッパーはアタッチされません。プロトコルマッパーのカスタマイズ(たとえばクライアントのプロトコルマッパー)を適切に検出することが不可能であるため、移行中に既存のクライアントを変更しませんでした。既存のクライアントを更新する(プロトコルマッパーを削除してクライアントスコープにリンクする)場合は、手動で行う必要があります。 - 同意を再度確認する必要があります
-
クライアントスコープの変更により、同意のリファクタリングが必要になりました。同意はロールまたはプロトコルマッパーではなく、クライアントスコープを指すようになりました。この変更により、ユーザーによって以前に確認された永続的な同意は無効になり、ユーザーは移行後に同意ページを再度確認する必要があります。
- 一部の設定スイッチが削除されました
-
Scope Param Required
スイッチがロール詳細から削除されました。Consent Required
およびConsent Text
スイッチがプロトコルマッパーの詳細から削除されました。これらのスイッチは、クライアントスコープ機能に置き換えられました。
Authorization Servicesの変更
UMA 2.0のサポートを追加しました。このバージョンのUMA仕様では、サーバーから許可を取得する方法にいくつかの重要な変更が導入されました。
UMA 2.0サポートによって導入された主な変更点は次のとおりです。詳細については、Authorization Servicesガイドを参照してください。
- Authorization APIが削除されました
-
UMA 2.0(UMA 1.0)より前は、クライアントアプリケーションはAuthorization APIを使用して、RPT形式でサーバーから許可を取得していました。新しいバージョンのUMA仕様ではAuthorization APIが削除され、Keycloakからも削除されました。UMA 2.0では、特定のグラントタイプを使用することにより、トークンエンドポイントからRPTを取得できるようになりました。詳細については、Authorization Servicesガイドを参照してください。
- Entitlement APIが削除されました
-
UMA 2.0の導入により、トークンエンドポイントとUMAグラントタイプを活用してKeycloakからRPTを取得できるようにし、異なるAPIを持つことを避けることにしました。Entitlement APIによって提供されていた機能は同じままにされ、1つ以上のリソースとスコープのセット、またはリソースまたはスコープが提供されていない場合はサーバーからのすべての許可を取得することが依然として可能です。詳細については、Authorization Servicesガイドを参照してください。
- UMAディスカバリーエンドポイントの変更
-
UMAディスカバリードキュメントが変更されました。詳細については、Authorization Servicesガイドを参照してください。
- Keycloak Authorization JavaScriptアダプターの変更
-
Keycloak Authorization JavaScriptアダプター(keycloak-authz.js)は、UMA 2.0によって導入された変更に準拠しながら、以前と同じ動作を維持するために変更されました。主な変更点は、
authorization
メソッドとentitlement
メソッドの両方を呼び出す方法です。これらのメソッドは、認可リクエストを表す特定のオブジェクトタイプを期待するようになりました。この新しいオブジェクトタイプは、UMAグラントタイプでサポートされているさまざまなパラメータをサポートすることにより、サーバーから許可を取得する方法に柔軟性を提供します。One of the main changes introduced by this release is that you are no longer required to exchange access tokens with RPTs in order to access resources protected by a resource server (when not using UMA). Depending on how the policy enforcer is configured on the resource server side, you can just send regular access tokens as a bearer token and permissions will still be enforced.
- Keycloak Authorization Client Java APIの変更
-
Keycloak Authorization Client Java APIの新しいバージョンにアップグレードすると、一部の表現クラスが
org.keycloak:keycloak-core
の異なるパッケージに移動されたことに気付くでしょう。
3.4.2への移行
OpenID Connect認証レスポンスにsession_stateパラメータを追加
OpenID Connectセッション管理仕様では、パラメータsession_state
がOpenID Connect認証レスポンスに存在することが要求されています。
過去のリリースでは、このパラメータはありませんでしたが、Keycloak は仕様で要求されているように、このパラメータをデフォルトで追加するようになりました。
ただし、一部の OpenID Connect / OAuth2 アダプター、特に古い Keycloak アダプターは、この新しいパラメータに問題がある可能性があります。
たとえば、クライアントアプリケーションへの認証が成功した後、パラメータは常にブラウザURLに存在します。このような場合、認証レスポンスにsession_state
パラメータを追加することを無効にすると便利な場合があります。これは、Keycloak管理コンソールの特定クライアントの設定で、古いアダプターとの互換性で説明されているOpenID Connect Compatibility Modes
セクションで行うことができます。認証レスポンスにsession_state
パラメータを追加しないようにするために、専用のExclude Session State From Authentication Response
スイッチが存在し、オンにすることができます。
パラメータsession_state は3.4.2で追加されましたが、Exclude Session State From Authentication Response スイッチは4.0.0.Beta1で追加されました。Keycloakサーバーが3.4.2または3.4.3にあり、session_state パラメータに問題がある場合は、サーバーを4.0.0.Beta1以降にアップグレードする必要があります。 |
3.2.0への移行
新しいパスワードハッシュアルゴリズム
2つの新しいパスワードハッシュアルゴリズム(pbkdf2-sha256およびpbkdf2-sha512)を追加しました。新しいレルムは、27500回のハッシュ反復処理でpbkdf2-sha256ハッシュアルゴリズムを使用します。pbkdf2-sha256はpbkdf2よりもわずかに高速であるため、反復処理は20000回から27500回に増やされました。
既存のレルムは、パスワードポリシーにハッシュアルゴリズム(指定なし)と反復処理(20000回)のデフォルト値が含まれている場合にアップグレードされます。ハッシュ反復処理を変更した場合は、より安全なハッシュアルゴリズムを使用したい場合に、手動でpbkdf2-sha256に変更する必要があります。
IDトークンにはscope=openidが必要
OpenID Connect仕様では、初期認証リクエストで値openid
を持つパラメータscope
を使用することが要求されています。したがって、Keycloak 2.1.0では、リダイレクトURIでscope=openid
を使用するようにアダプターを変更しました。今回、サーバー側も変更し、IDトークンはscope=openid
が実際に使用されている場合にのみアプリケーションに送信されるようになります。使用されていない場合、IDトークンはスキップされ、アクセストークンとリフレッシュトークンのみがアプリケーションに送信されます。これにより、たとえばスペースやパフォーマンスの目的で、意図的にIDトークンの生成を省略することもできます。
ダイレクトグラント(OAuth2リソースオーナーパスワードクレデンシャルグラント)およびサービスアカウントログイン(OAuth2クライアントクレデンシャルグラント)も、デフォルトではIDトークンを使用しなくなりました。IDトークンを含めるには、明示的にscope=openid
パラメータを追加する必要があります。
認証セッションとアクショントークン
複数のデータセンターのサポートに取り組んでいます。最初のステップとして、認証セッションとアクショントークンを導入しました。認証セッションは、以前のバージョンで使用されていたクライアントセッションに代わるものです。アクショントークンは現在、特に認証機構またはRequiredActionProviderがユーザーにメールを送信し、ユーザーがメール内のリンクをクリックすることを要求するシナリオで使用されています。
移行に影響を与える可能性のある具体的な変更点は次のとおりです。
これに関連する最初の変更は、standalone.xml
またはstandalone-ha.xml
に新しいInfinispanキャッシュauthenticationSessions
とactionTokens
を導入することです。移行CLIを使用している場合は、standalone(-ha).xml
ファイルが自動的に移行されるため、あまり気にする必要はありません。
2番目の変更は、認証SPIのメソッドのいくつかの署名の変更です。カスタムAuthenticator
またはRequiredActionProvider
を使用している場合は影響を受ける可能性があります。クラスAuthenticationFlowContext
とRequiredActionContext
で、クライアントセッションの代わりに認証セッションを取得できるようになりました。
スティッキーセッションの初期サポートも追加しました。ロードバランサー/プロキシサーバーを変更し、それによってパフォーマンスが低下したくない場合は、ロードバランサー/プロキシサーバーを設定することをお勧めします。ルートは新しいAUTH_SESSION_ID
クッキーに追加されます。詳細については、クラスタリングドキュメントを参照してください。
もう1つの変更は、token.getClientSession()
が削除されたことです。これは、たとえばクライアント開始のアイデンティティブローカーリンキング機能を使用している場合に影響を受ける可能性があります。
ScriptBasedAuthenticator
はバインディング名をclientSession
からauthenticationSession
に変更したため、この認証機構を使用している場合はスクリプトを更新する必要があります。
最後に、管理コンソールにいくつかの新しいタイムアウトを追加しました。これにより、たとえば管理者とユーザー自身によってトリガーされたメールアクションに異なるタイムアウトを指定できます。
2.5.1への移行
古いオフライン トークンの移行
バージョン2.2.0以前から移行し、オフライン トークンを使用していた場合、オフライン トークンにはトークンヘッダーにKIDがありませんでした。2.3.0でトークンヘッダーにKIDを追加し、複数のレルムキーを持つ機能を導入したため、KeycloakはトークンKIDに基づいて正しいキーを見つけることができます。
KID なしでオフライン トークンを使用する場合、Keycloak 2.5.1 は常にアクティブなレルムキーを使用して、トークン検証に適したキーを検索します。言い換えれば、古いオフライン トークンの移行は機能します。たとえば、ユーザーが 1.9.8 でオフライン トークンをリクエストし、その後 1.9.8 から 2.5.1 に移行した場合、ユーザーは 2.5.1 バージョンでも古いオフライン トークンを更新できます。
ただし、制限事項があります。レルムのアクティブキーを変更すると、ユーザーは古いオフライン トークンを更新できなくなります。したがって、オフライン トークンを持つすべてのユーザーがトークンを更新するまで、アクティブなレルムキーを変更しないでください。明らかに、新しく更新されたトークンにはヘッダーに KID が含まれるため、すべてのユーザーが古いオフライン トークンを交換した後、アクティブなレルムキーを自由に変更できます。
2.4.0 への移行
Server SPI が Server SPI と Sever SPI Private に分割
keycloak-server-spi モジュールは、keycloak-server-spi と keycloak-server-spi-private に分割されました。keycloak-server-spi 内の API はマイナーリリース間で変更されませんが、keycloak-server-spi-private 内の API はマイナーリリース間で変更される可能性があり、またその権利を留保します。
2.3.0 への移行
ページネーションされたエンドポイントのデフォルトの最大結果数
ページネーションをサポートするすべての Admin REST API エンドポイントには、デフォルトの最大結果数が 100 に設定されるようになりました。100 を超えるエントリを返す場合は、?max=<RESULTS>
で明示的に指定する必要があります。
realm-public-key
アダプタープロパティは非推奨
2.3.0 リリースでは、公開鍵ローテーションのサポートを追加しました。管理者が Keycloak 管理コンソールでレルムキーをローテーションすると、クライアントアダプターはそれを認識し、Keycloak から新しい公開鍵を自動的にダウンロードできます。ただし、この新しいキーの自動ダウンロードは、アダプターにハードコードされた公開鍵を持つ realm-public-key
オプションがない場合にのみ実行されます。このため、アダプター設定で realm-public-key
オプションをもう使用しないことをお勧めします。
このオプションはまだサポートされていますが、アダプター設定にハードコードされた公開鍵を持ち、Keycloak から公開鍵をダウンロードしない場合にのみ役立つ場合があります。理論的には、アダプターと Keycloak の間に信頼できないネットワークがある場合に、中間者攻撃を回避するための理由の 1 つになりますが、その場合は、HTTPS を使用する方がはるかに良いオプションであり、アダプターと Keycloak 間のすべてのリクエストを保護します。
2.2.0 への移行
databaseSchema
プロパティは非推奨
JPA と Mongo の両方の databaseSchema
プロパティは、現在非推奨であり、initializeEmpty
および migrationStrategy
に置き換えられました。initializeEmpty
は true
または false
に設定でき、空のデータベースを初期化するかどうかを制御します。migrationStrategy
は、update
、validate
、および manual
に設定できます。manual
はリレーショナルデータベースでのみサポートされており、データベーススキーマに必要な変更を含む SQL ファイルを書き込みます。Oracle データベースの場合、作成された SQL ファイルには、Oracle SQL クライアントによって理解される SET DEFINE OFF
コマンドが含まれていることに注意してください。スクリプトが他のクライアントによって使用される場合は、変数の展開を無効にするツールの同等のコマンドでそれらの行を置き換えるか、そのような機能が適用できない場合は完全に削除してください。
クライアントの有効なリダイレクト URI の変更
次のシナリオが影響を受けます
-
クエリコンポーネントを持つ有効なリダイレクト URI がクライアントに保存されている場合 (例:
https://#/auth?foo=bar
)、認証リクエストのredirect_uri
は、この URI (またはこのクライアントに登録されている他の URI) と完全に一致する必要があります。 -
クエリコンポーネントなしの有効なリダイレクト URI がクライアントに保存されている場合、
redirect_uri
も完全に一致する必要があります。 -
登録された有効なリダイレクト URI のワイルドカードは、この URI にクエリコンポーネントが存在する場合はサポートされなくなったため、
redirect_uri
はこの保存された URI と完全に一致する必要があります。 -
登録された有効なリダイレクト URI のフラグメント (
https://#/auth#fragment
など) は許可されなくなりました。
1.9.2 への移行
アダプターオプション auth-server-url-for-backend-requests の削除
auth-server-url-for-backend-requests オプションは、使用した場合に一部のシナリオで問題が発生したため削除しました。詳細については、2 つの異なるコンテキスト (内部と外部) から Keycloak サーバーにアクセスでき、トークン検証などで問題が発生していました。
このオプションが提供するネットワークの最適化 (アプリケーションがバックチャネルリクエストをロードバランサー経由で送信するのではなく、ローカル Keycloak サーバーに直接送信することを回避する) を引き続き使用する場合は、ホスト構成 (DNS) レベルで処理する必要がある場合があります。
1.9.0 への移行
テーマとプロバイダーのディレクトリの移動
テーマとプロバイダーのディレクトリを standalone/configuration/themes
および standalone/configuration/providers
からそれぞれ themes
および providers
に移動しました。カスタムテーマとプロバイダーを追加した場合は、新しい場所に移動する必要があります。また、これにより keycloak-server.json
が変更されたため、更新する必要があります。
アダプターサブシステムは Keycloak がオンの場合にのみ依存関係を取り込む
以前は、SAML または OIDC Keycloak サブシステムアダプターを WildFly または JBoss EAP にインストールした場合、Keycloak を使用しているかどうかに関係なく、すべてのアプリケーションに Keycloak クライアント jar を自動的に含めていました。これらのライブラリは、そのアダプターに対して Keycloak 認証がオンになっている場合 (サブシステム経由、または web.xml の auth-method 経由) にのみ、デプロイメントに追加されるようになりました。
クライアント登録サービスエンドポイントの移動
クライアント登録サービスエンドポイントが {realm-name}/clients
から {realm-name}/clients-registrations
に移動しました。
認証レスポンスのセッション状態パラメーターの名前変更
OpenID Connect 認証レスポンスでは、セッション状態を session-state
として返していましたが、これは仕様に従っていないため、session_state
に名前が変更されました。
非推奨の OpenID Connect エンドポイント
1.2 では、OpenID Connect 仕様と一貫性のない多数のエンドポイントを非推奨にしましたが、これらは削除されました。これは、1.8 の新しいイントロスペクトエンドポイントに置き換えられたトークン検証エンドポイントにも適用されます。
モジュールとソースコードの再編成
モジュールとソースコードのほとんどは、2 つの Maven モジュール (keycloak-server-spi と keycloak-services) に統合されました。SPI インターフェースは server-spi にあり、実装は keycloak-services にあります。すべての JPA 依存モジュールは keycloak-model-jpa の下に統合されました。mongo および Infinispan も、モジュール keycloak-model-mongo および keycloak-model-infinispan の下に統合されました。
1.8.0 への移行
管理者アカウント
以前のリリースでは、デフォルトの管理者ユーザーとデフォルトのパスワードが同梱されていましたが、これは削除されました。1.8 の新規インストールを実行する場合は、最初の手順として管理者ユーザーを作成する必要があります。
OAuth2 トークンイントロスペクション
OAuth2 仕様への準拠性を高めるために、トークンイントロスペクション用の新しいエンドポイントを追加しました。新しいエンドポイントは /realms/{realm-name}/protocols/openid-connect/token/introspect
でアクセスでき、RFC-7662
のみに基づいています。
/realms/{realm-name}/protocols/openid-connect/validate
エンドポイントは非推奨になり、できるだけ早く新しいイントロスペクションエンドポイントに移行することを強くお勧めします。この変更の理由は、RFC-7662 がより標準的で安全なイントロスペクションエンドポイントを提供するためです。
新しいトークンイントロスペクション URL は、/realms/{realm-name}/.well-known/openid-configuration
の OpenID Connect プロバイダーの構成から取得できるようになりました。レスポンス内に token_introspection_endpoint
という名前のクレームがあります。confidential clients
のみが新しいエンドポイントを呼び出すことが許可されており、これらのクライアントは通常、リソースサーバーとして機能し、ローカル認証チェックを実行するためにトークンメタデータを探します。
1.7.0.CR1 への移行
クライアントのダイレクトアクセス許可がデフォルトで無効
OpenID Connect 仕様への準拠性を高めるために、クライアント設定ページにフラグを管理コンソールに追加しました。ここでは、さまざまな種類の OpenID Connect/OAuth2 フロー (標準フロー、暗黙的フロー、ダイレクトアクセス許可、サービスアカウント) を有効/無効にできます。これの一環として、新しいクライアントの ダイレクトアクセス許可
(OAuth2 リソースオーナーパスワード資格情報許可
に対応) がデフォルトで無効になっています。
以前のバージョンから移行されたクライアントは、ダイレクト許可のみ
フラグがオンになっている場合にのみ ダイレクトアクセス許可
が有効になっています。ダイレクトアクセス許可を有効にし、標準+暗黙的フローの両方を無効にすると同じ効果が得られるため、ダイレクト許可のみ
フラグは削除されました。
また、各レルムに組み込みクライアント admin-cli
を追加しました。このクライアントは ダイレクトアクセス許可
が有効になっています。したがって、Admin REST API または Keycloak admin-client を使用している場合は、security-admin-console
の代わりに admin-cli
を使用するように構成を更新する必要があります。後者はデフォルトでダイレクトアクセス許可が有効になっていないためです。
[最初のログイン時にプロファイルを更新] オプションが ID プロバイダーからプロファイル確認オーセンティケーターに移動
このバージョンでは、ID プロバイダー (またはソーシャルプロバイダー) を介して新しいユーザーがログインしたが、ソーシャルアカウントにリンクされた Keycloak ユーザーがまだ存在しない場合に正確に何をすべきかを指定できる 最初のブローカーログイン
を追加しました。この作業の一環として、ID プロバイダーに 最初のログインフロー
オプションを追加しました。ここではフローを指定でき、管理コンソールの [認証] タブでこのフローを構成できます。
また、最初のログイン時にプロファイルを更新
オプションを ID プロバイダーの設定から削除し、プロファイル確認
オーセンティケーターの構成に移動しました。したがって、ID プロバイダーに使用するフロー (デフォルトでは 最初のブローカーログイン
フロー) を指定したら、[認証] タブに移動し、フローを選択して、プロファイル確認
オーセンティケーターでオプションを構成します。
web.xml の要素 'form-error-page' はサポートされなくなりました
web.xml の form-error-page は、クライアントアダプターの認証エラーでは機能しなくなりました。さまざまな HTTP エラーコードのエラーページを定義する必要があります。アダプターのエラー状態をキャッチして処理する場合は、詳細についてドキュメントを参照してください。
IdentityProviderMapper の変更
インターフェース自体とメソッドシグネチャは変更されていません。ただし、動作にいくつかの変更があります。このリリースで 最初のブローカーログイン
フローを追加し、IdentityProviderMapper.importNewUser
メソッドは 最初のブローカーログイン
フローが完了した後に呼び出されるようになりました。したがって、プロファイル確認
ページで属性を使用できるようにする場合は、importNewUser
の代わりに preprocessFederatedIdentity
メソッドを使用する必要があります。BrokeredIdentityContext.setUserAttribute
を呼び出すことで属性を設定でき、それは プロファイル確認
ページで使用できるようになります。
1.6.0.Final への移行
リフレッシュトークンが再利用できなくなったオプション
Keycloak の古いバージョンでは、リフレッシュトークンを複数回再利用できました。Keycloak はこれを引き続き許可していますが、それを禁止する リフレッシュトークンを失効させる
オプションもあります。オプションは管理コンソールのトークン設定の下にあります。リフレッシュトークンを使用して新しいアクセストークンを取得すると、新しいリフレッシュトークンも含まれます。オプションが有効になっている場合、次回アクセストークンを更新するときは、この新しいリフレッシュトークンを使用する必要があります。古いリフレッシュトークンを複数回再利用することはできません。
一部のパッケージの名前変更
少し再構築を行い、一部のパッケージの名前を変更しました。主にユーティリティクラスの内部パッケージの名前変更についてです。アプリケーションで使用される最も重要なクラス (たとえば、AccessToken または KeycloakSecurityContext) と SPI は、まだ変更されていません。ただし、影響を受けてクラスのインポートを更新する必要があるわずかな可能性があります。たとえば、マルチテナンシーと KeycloakConfigResolver を使用している場合、クラス HttpFacade が別のパッケージに移動されたため影響を受けます。現在は org.keycloak.adapters.spi.HttpFacade
です。
ユーザーセッションの永続化
このリリースではオフライン トークンのサポートを追加しました。つまり、「オフライン」ユーザーセッションをデータベースに永続化するようになりました。オフライン トークンを使用していない場合、何も永続化されないため、DB 書き込みの増加によるパフォーマンスの低下を気にする必要はありません。ただし、すべての場合において、standalone/configuration/keycloak-server.json
を更新し、次のように userSessionPersister
を追加する必要があります。
"userSessionPersister": {
"provider": "jpa"
},
セッションを従来の RDBMS の代わりに Mongo に永続化する場合は、プロバイダー mongo
を代わりに使用します。
1.5.0.Final への移行
レルムおよびユーザーキャッシュプロバイダー
Infinispan がデフォルトであり、唯一のレルムおよびユーザーキャッシュプロバイダーになりました。非クラスターモードでは、ローカル Infinispan キャッシュが使用されます。カスタムインメモリキャッシュとキャッシュなしプロバイダーも削除しました。keycloak-server.json で realmCache または userCache が mem または none に設定されている場合は、これらを削除してください。Infinispan が唯一のプロバイダーであるため、realmCache オブジェクトと userCache オブジェクトは不要になり、削除できます。
セッションプロバイダーの使用
Infinispan がデフォルトであり、唯一のユーザーセッションプロバイダーになりました。非クラスターモードでは、ローカル Infinispan キャッシュが使用されます。JPA および Mongo ユーザーセッションプロバイダーも削除しました。keycloak-server.json で userSession が mem、jpa、または mongo に設定されている場合は、削除してください。Infinispan が唯一のプロバイダーであるため、userSession オブジェクトは不要になり、削除できます。
ユーザーセッションの耐久性を高めたい場合は、ユーザーセッションキャッシュを複数のオーナーで構成するか、レプリケートされたキャッシュを使用することで実現できます。パフォーマンスに影響を与える可能性がありますが、Infinispan を構成してキャッシュを永続化することも可能です。
1.3.0.Final への移行
ダイレクトグラント API は常に有効
以前は、ダイレクトグラント API (またはリソースオーナーパスワード資格情報) はデフォルトで無効になっており、レルムで有効にするオプションが存在していました。ダイレクトグラント API は常に有効になり、レルムで有効/無効にするオプションは削除されました。
UserFederationProvider の変更
UserFederationProvider インターフェースにいくつかのマイナーチェンジがあります。新しいバージョンにアップグレードするときに実装を同期し、署名が変更されたいくつかのメソッドをアップグレードする必要がある場合があります。変更は非常にマイナーですが、フェデレーションのパフォーマンスを向上させるために必要でした。
WildFly 9.0.0.Final
前回のリリースで行われたディストリビューションの変更に続いて、Keycloak のスタンドアロンプリダウンロードは WildFly 9.0.0.Final に基づいています。これは、WildFly 9.0.0.Final または JBoss EAP 6.4.0.GA にのみデプロイできるオーバーレイにも影響します。WildFly 8.2.0.Final は、サーバーではサポートされなくなりました。
WildFly、JBoss EAP、および JBoss AS7 アダプター
WildFly、JBoss EAP、および JBoss AS7 用に 3 つの個別の Adapter ダウンロードが用意されました
-
eap6
-
wf9
-
wf8
-
as7
正しいものを入手してください。
また、拡張モジュールとサブシステム定義が変更されたため、standalone.xml を更新する必要があります。詳細については、アプリケーションの保護ガイドを参照してください。
1.2.0.Beta1 から 1.2.0.RC1 への移行
ディストリビューションの変更
Keycloak は、スタンドアロン、オーバーレイ、デモバンドルの 3 つのダウンロードで利用できるようになりました。スタンドアロンは、本番環境および非 JEE 開発者向けです。オーバーレイは、既存の WildFly 8.2 または EAP 6.4 インストールに Keycloak を追加することを目的としており、主に開発用です。最後に、Keycloak を使い始める開発者向けのデモ (または dev) バンドルがあります。このバンドルには、Keycloak サーバーとアダプターを含む WildFly サーバーが含まれています。また、すべてのドキュメントと例が含まれています。
1.1.0.Final から 1.2.0.Beta1 への移行
アクセスおよび ID トークンの iss
アクセスおよび ID トークンの iss
クレームの値が、レルム名
から レルム URL
に変更されました。これは OpenID Connect 仕様で必須です。アダプターを使用している場合は、auth-server-url
を指定せずにベアラー専用を使用している場合を除き、変更は必要ありません。その場合は、今すぐ追加する必要があります。別のライブラリ (または RSATokenVerifier) を使用している場合は、iss
を検証するときに対応する変更を行う必要があります。
OpenID Connect エンドポイント
OpenID Connect 仕様に準拠するために、認証およびトークンエンドポイントは、単一の認証エンドポイントと単一のトークンエンドポイントを持つように変更されました。仕様ごとに、response_type
および grant_type
パラメーターは、必要なフローを選択するために使用されます。古いエンドポイント (/realms/{realm-name}/protocols/openid-connect/login
、/realms/{realm-name}/protocols/openid-connect/grants/access
、/realms/{realm-name}/protocols/openid-connect/refresh
、/realms/{realm-name}/protocols/openid-connect/access/codes
) は非推奨になり、将来のバージョンで削除されます。
テーマの変更
テーマのレイアウトが変更されました。ディレクトリ階層は以前は type/name
でしたが、現在は name/type
に変更されました。たとえば、sunrise
という名前のログインテーマは、以前は standalone/configuration/themes/login/sunrise
にデプロイされていましたが、現在は standalone/configuration/themes/sunrise/login
に移動されました。この変更は、同じテーマのさまざまなタイプのグループを 1 つのフォルダーにまとめるのを容易にするために行われました。
以前にテーマを JAR としてデプロイした場合、Java コードを必要とするカスタムテーマローダーを作成する必要がありました。これは、JAR に含まれるテーマを記述するためのプレーンテキストファイル (META-INF/keycloak-themes.json
) のみを必要とするように簡略化されました。
クレームの変更
以前は、アプリケーションおよび OAuth クライアントの管理コンソールに専用の クレーム
タブがありました。これは、特定のアプリケーション/クライアントのアクセストークンに含める属性を構成するために使用されていました。これは削除され、より柔軟なプロトコルマッパーに置き換えられました。
以前のバージョンからのデータベースの移行について気にする必要はありません。特定のアプリケーション/クライアント用に構成されたクレームが対応するプロトコルマッパーに変換されることを保証する RDBMS と Mongo の両方の移行スクリプトを作成しました (ただし、新しいバージョンに移行する前に DB をバックアップする方が安全です)。以前のバージョンからエクスポートされた JSON 表現にも同じことが当てはまります。
ソーシャルの ID ブローカリングへの移行
ソーシャルプロバイダー SPI をリファクタリングし、より柔軟な ID ブローカリング SPI に置き換えました。管理コンソールの ソーシャル
タブの名前が ID プロバイダー
タブに変更されました。
クレーム/プロトコルマッパーと同様に、以前のバージョンからのデータベースの移行について気にする必要はありません。ソーシャルプロバイダーの構成とユーザーへの「ソーシャルリンク」の両方が、対応する ID プロバイダーに変換されます。
必要なアクションは、特定のサードパーティソーシャルプロバイダーの管理コンソールで許可された リダイレクト URI
を変更することだけです。最初に Keycloak 管理コンソールに移動し、ID プロバイダーを構成するページからリダイレクト URI をコピーできます。次に、これを許可されたリダイレクト URI としてサードパーティプロバイダーの管理コンソール (IE Facebook 管理コンソール) に貼り付けることができます。
1.1.0.Beta1 から 1.1.0.Beta2 への移行
-
アダプターは個別のダウンロードになりました。これらはアプライアンスおよび war ディストリビューションには含まれていません。アダプターが多すぎるため、ディストリビューションが肥大化しています。
-
org.keycloak.adapters.tomcat7.KeycloakAuthenticatorValve
+org.keycloak.adapters.tomcat.KeycloakAuthenticatorValve
-
JavaScript アダプターには、idToken および idTokenParsed プロパティが含まれるようになりました。idToken を使用して名、メールなどを取得する場合は、これを idTokenParsed に変更する必要があります。
-
as7-eap-subsystem と keycloak-wildfly-subsystem が 1 つの keycloak-subsystem に統合されました。既存の standalone.xml または domain.xml がある場合は、ファイルの先頭付近を編集し、拡張モジュール名を org.keycloak.keycloak-subsystem に変更する必要があります。AS7 のみの場合、拡張モジュール名は org.keycloak.keycloak-as7-subsystem です。
-
サーバーインストールは AS7 ではサポートされなくなりました。AS7 をアプリケーションクライアントとして引き続き使用できます。
1.0.x.Final から 1.1.0.Beta1 への移行
-
RealmModel JPA および Mongo ストレージスキーマが変更されました
-
UserSessionModel JPA および Mongo ストレージスキーマは、これらのインターフェースがリファクタリングされたため変更されました
-
アダプターをアップグレードしてください。古いアダプターは Keycloak 1.1 と互換性がありません。JSON Web Token および OIDC ID トークン仕様を誤って解釈しました。「aud」クレームはクライアント ID である必要がありましたが、そこにレルム名を格納して検証していました。
1.0 RC-1 から RC-2 への移行
-
多くの情報レベルのロギングがデバッグに変更されました。また、レルムにはデフォルトで jboss-logging 監査リスナーがなくなりました。ユーザーがログイン、ログアウト、パスワードを変更したときなどにログ出力を出力する場合は、管理コンソールから jboss-logging 監査リスナーを有効にします。
1.0 Beta 4 から RC-1 への移行
-
logout REST API がリファクタリングされました。ログアウト URI への GET リクエストは、もはや session_state パラメータを受け取りません。セッションをログアウトするには、ログインしている必要があります。ログアウト REST URI に POST リクエストを送信することもできます。このアクションには、ログアウトを実行するための有効なリフレッシュトークンが必要です。署名は、グラントタイプのフォームパラメータを除いて、リフレッシュトークンと同じです。詳細については、ドキュメントを参照してください。
1.0 Beta 1 から Beta 4 への移行
-
LDAP/AD の設定が変更されました。「設定」ページにはなくなり、「ユーザー」→「フェデレーション」に移動しました。「プロバイダーを追加」をクリックすると、「ldap」オプションが表示されます。
-
Authentication SPI は削除され、書き直されました。新しい SPI は UserFederationProvider で、より柔軟性があります。
-
ssl-not-required
+ssl-required
+all
+external
+none
-
DB スキーマが再度変更されました。
-
作成されたアプリケーションは、デフォルトでフルスコープを持つようになりました。これは、必要がない場合は、アプリケーションのスコープを設定する必要がないことを意味します。
-
realm データをインポートするための JSON ファイルの形式が変更されました。ロールマッピングは、特定のユーザーの JSON レコードの下で利用可能になりました。
1.0 Alpha 4 から Beta 1 への移行
-
DB スキーマが変更されました。データベースのエクスポートを Beta 1 に追加しましたが、古いバージョンからデータベースをインポートする機能は追加していません。これは将来のリリースでサポートされる予定です。
-
bearer-only アプリケーションを除くすべてのクライアントについて、少なくとも1つのリダイレクト URI を指定する必要があります。Keycloak は、そのアプリケーションに対して有効なリダイレクト URI を指定しない限り、ログインを許可しません。
-
Direct Grant API +
ON
-
standalone/configuration/keycloak-server.json
-
JavaScript アダプター
-
セッションタイムアウト
1.0 Alpha 2 から Alpha 3 への移行
-
SkeletonKeyToken、SkeletonKeyScope、SkeletonKeyPrincipal、および SkeletonKeySession は、それぞれ AccessToken、AccessScope、KeycloakPrincipal、および KeycloakAuthenticatedSession に名前が変更されました。
-
ServletOAuthClient.getBearerToken() メソッドのシグネチャが変更されました。リフレッシュトークンも取得できるように、AccessTokenResponse を返すようになりました。
-
アダプターは、すべてのリクエストでアクセストークンの有効期限をチェックするようになりました。トークンが期限切れの場合、保存されたリフレッシュトークンを使用して認証サーバーでリフレッシュを試みます。
-
AccessToken の Subject がユーザー ID に変更されました。
1.0 Alpha 1 から Alpha 2 への移行
-
DB スキーマが変更されました。Alpha 2 の時点では、まだデータ移行ユーティリティはありません。
-
JBoss および WildFly アダプターは、WildFly サブシステムを介してインストールされるようになりました。アダプターのインストールに関するドキュメントを確認してください。standalone.xml の編集が必須になりました。
-
新しいクレデンシャルタイプ「secret」が導入されました。他のクレデンシャルタイプとは異なり、データベースにプレーンテキストで保存され、管理コンソールで表示できます。
-
アプリケーションおよび OAuth クライアントのクレデンシャルは不要になりました。これらのクライアントタイプは、「secret」クレデンシャルタイプを使用するようにハードコードされています。
-
アプリケーションおよび OAuth クライアントへの「secret」クレデンシャルの変更により、keycloak.json 設定ファイルを更新し、管理コンソールのアプリケーションまたは OAuth クライアントのクレデンシャルタブ内でシークレットを再生成する必要があります。
Keycloak サーバーのアップグレード
アダプターをアップグレードする前に、サーバーをアップグレードします。
アップグレードの準備
サーバーをアップグレードする前に、次の手順を実行してください。
-
Keycloak をシャットダウンします。
-
古いインストール(構成、テーマなど)をバックアップします。
-
XA トランザクションが有効になっている場合は、未処理のトランザクションを処理し、
data/transaction-logs/
トランザクションディレクトリを削除します。 -
リレーショナルデータベースのドキュメントの手順に従ってデータベースをバックアップします。
サーバーをアップグレードすると、データベースは古いサーバーと互換性がなくなります。アップグレードを元に戻す必要がある場合は、まず古いインストールを復元し、次にバックアップコピーからデータベースを復元します。
現在のセットアップで |
ブルートフォース検出のためのログイン失敗に関する情報、および現在進行中の認証フローに関する情報は、Keycloak がシャットダウンされたときにクリアされる内部キャッシュにのみ保存されます。現在認証中、パスワードの変更中、またはパスワードのリセット中のユーザーは、Keycloak が起動して再度実行されたら、認証フローを再開する必要があります。 |
Keycloak サーバーのダウンロード
アップグレードの準備が完了したら、サーバーをダウンロードできます。
-
Keycloak ウェブサイトから keycloak-26.2.0.zip をダウンロードして解凍します。
このファイルを解凍すると、
keycloak-26.2.0
という名前のディレクトリが作成されます。 -
このディレクトリを目的の場所に移動します。
-
以前のインストールから新しいインストールに
conf/
、providers/
、およびthemes/
をコピーします。
データベースの移行
Keycloak はデータベーススキーマを自動的に移行できます。または、手動で実行することもできます。デフォルトでは、新しいインストールを初めて起動するときに、データベースは自動的に移行されます。
自動リレーショナルデータベース移行
自動移行を実行するには、目的のデータベースに接続されたサーバーを起動します。データベーススキーマが新しいサーバーバージョン用に変更されている場合、データベースにレコードが多すぎない限り、移行は自動的に開始されます。
たとえば、数百万件のレコードを持つテーブルにインデックスを作成すると、時間がかかり、重大なサービス中断を引き起こす可能性があります。したがって、自動移行には 300000
レコードのしきい値が存在します。レコード数がこのしきい値を超えると、インデックスは作成されません。代わりに、手動で適用できる SQL コマンドを含む警告がサーバーログに表示されます。
しきい値を変更するには、connections-liquibase
プロバイダーの index-creation-threshold
プロパティ値を設定します。
kc.[sh|bat] start --spi-connections-liquibase-quarkus-index-creation-threshold=300000
手動リレーショナルデータベース移行
データベーススキーマの手動アップグレードを有効にするには、デフォルトの connections-jpa
プロバイダーの migration-strategy
プロパティ値を "manual" に設定します。
kc.[sh|bat] start --spi-connections-jpa-quarkus-migration-strategy=manual
この構成でサーバーを起動すると、サーバーはデータベースを移行する必要があるかどうかを確認します。必要な変更は bin/keycloak-database-update.sql
SQL ファイルに書き込まれ、それを確認してデータベースに対して手動で実行できます。
エクスポートされた SQL ファイルのパスと名前を変更するには、デフォルトの connections-jpa
プロバイダーの migration-export
プロパティを設定します。
kc.[sh|bat] start --spi-connections-jpa-quarkus-migration-export=<path>/<file.sql>
このファイルをデータベースに適用する方法の詳細については、リレーショナルデータベースのドキュメントを参照してください。変更がファイルに書き込まれると、サーバーは終了します。
テーマの移行
カスタムテーマを作成した場合、それらのテーマを新しいサーバーに移行する必要があります。また、組み込みテーマへの変更は、カスタマイズした側面に応じて、カスタムテーマに反映する必要がある場合があります。
-
古いサーバーの
themes
ディレクトリから新しいサーバーのthemes
ディレクトリにカスタムテーマをコピーします。 -
テンプレート、メッセージ、およびスタイルを移行するには、次のセクションを使用します。
-
移行の変更点 にリストされている更新されたテンプレートをカスタマイズした場合、ベーステーマのテンプレートと比較して、適用する必要がある変更を確認します。
-
メッセージをカスタマイズした場合、キーまたは値を変更するか、追加のメッセージを追加する必要がある場合があります。
-
スタイルをカスタマイズし、Keycloak テーマを拡張している場合は、スタイルの変更を確認します。ベーステーマを拡張している場合は、この手順をスキップできます。
-
テンプレートの移行
テンプレートをカスタマイズした場合、新しいバージョンを確認して、カスタマイズしたテンプレートを更新するかどうかを決定します。小さな変更を加えた場合は、更新されたテンプレートとカスタマイズしたテンプレートを比較できます。ただし、多くの変更を加えた場合は、新しいテンプレートとカスタマイズしたテンプレートを比較することを検討してください。この比較により、必要な変更点がわかります。
テンプレートを比較するには、diff ツールを使用できます。次のスクリーンショットは、ログインテーマの info.ftl
テンプレートとカスタムテーマの例を比較したものです。
この比較は、最初の変更 (Hello world!!
) がカスタマイズであり、2 番目の変更 (if pageRedirectUri
) がベーステーマへの変更であることを示しています。2 番目の変更をカスタムテンプレートにコピーすることで、カスタマイズされたテンプレートを正常に更新しました。
代替アプローチでは、次のスクリーンショットは、古いインストールからの info.ftl
テンプレートと、新しいインストールからの更新された info.ftl
テンプレートを比較したものです。
この比較は、ベーステンプレートで何が変更されたかを示しています。その後、変更したテンプレートに同じ変更を手動で行うことができます。このアプローチはより複雑であるため、最初のアプローチが実現可能でない場合にのみこのアプローチを使用してください。
メッセージの移行
別の言語のサポートを追加した場合、上記のすべての変更を適用する必要があります。別の言語のサポートを追加していない場合は、何も変更する必要がない場合があります。テーマ内の影響を受けるメッセージを変更した場合にのみ、変更を行う必要があります。
-
追加された値については、ベーステーマのメッセージの値を確認して、そのメッセージをカスタマイズする必要があるかどうかを判断します。
-
名前が変更されたキーについては、カスタムテーマでキーの名前を変更します。
-
変更された値については、ベーステーマの値を確認して、カスタムテーマに変更を加える必要があるかどうかを判断します。
スタイルの移行
組み込みテーマのスタイルに加えられた変更を反映するために、カスタムスタイルを更新する必要がある場合があります。古いサーバーインストールと新しいサーバーインストールの間で、スタイルシートの変更を比較するために diff ツールを使用することを検討してください。
例:
$ diff KEYCLOAK_HOME_OLD/themes/keycloak/login/resources/css/login.css \
KEYCLOAK_HOME_NEW/themes/keycloak/login/resources/css/login.css
変更を確認し、カスタムスタイリングに影響を与えるかどうかを判断します。
Keycloak アダプターのアップグレード
Keycloak サーバーをアップグレードした後、アダプターをアップグレードできます。以前のバージョンのアダプターは、Keycloak サーバーの新しいバージョンで動作する可能性がありますが、Keycloak サーバーの以前のバージョンは、アダプターの新しいバージョンでは動作しない場合があります。
古いアダプターとの互換性
Keycloak サーバーの新しいバージョンは、古いバージョンのアダプターで動作する可能性があります。ただし、Keycloak サーバーの一部の修正は、古いバージョンのアダプターとの互換性を損なう可能性があります。たとえば、OpenID Connect 仕様の新しい実装は、古いクライアントアダプターのバージョンと一致しない場合があります。
この状況では、互換モードを使用できます。OpenID Connect クライアントの場合、管理コンソールには、クライアントの詳細ページにOpenID Connect 互換モードが含まれています。このオプションを使用すると、Keycloak サーバーのいくつかの新しい側面を無効にして、古いクライアントアダプターとの互換性を維持できます。詳細については、個々のスイッチのツールチップを参照してください。
EAP アダプターのアップグレード
WildFly アダプターをアップグレードするには、次の手順を実行します。
-
新しいアダプターアーカイブをダウンロードします。
-
WILDFLY_HOME/modules/system/add-ons/keycloak/
ディレクトリを削除して、以前のアダプターモジュールを削除します。 -
ダウンロードしたアーカイブを
WILDFLY_HOME
に解凍します。
JavaScript アダプターのアップグレード
JavaScript アダプターをアップグレードするには、NPM から最新バージョンをインストールします。
-
npm install keycloak-js@latest
Node.js
アダプターのアップグレード
Node.js
アダプターをアップグレードするには、 Node.js adapter
ドキュメントを参照してください。