Keycloakのアップグレード

このガイドでは、Keycloakをアップグレードする方法について説明します。次の手順をこの順序で使用してください。

  1. 以前のバージョンのKeycloakからの移行の変更を確認します。

  2. Keycloakサーバーをアップグレードします。

  3. Keycloakアダプターをアップグレードします。

  4. 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_jwtclient_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-enabledfalseに設定することで無効にできます。

詳細については、分散キャッシュガイドのトランスポートスタックの保護を確認してください。

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_issuerrequested_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_idclientHost、および clientAddress) の特定のクレームを追加する役割を担います。このスコープは、クライアント構成で serviceAccountsEnabled オプションが設定または設定解除されたときに、クライアントに自動的に割り当ておよび割り当て解除されます。

以前は、クライアントがサービスアカウントを有効にするように構成されていた場合、3 つのマッパー (Client IdClient 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 および非サーバーコマンド importexport、または 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 を使用します。

Organizations および OrganizationMembers API での getAll() メソッドの非推奨化

Organizations および OrganizationMembers API の getAll() メソッドは非推奨となり、次のメジャーリリースで削除されます。代わりに、Organizations および OrganizationMembers API で対応する list(first, max) メソッドを使用してください。

分散キャッシュの非推奨トランスポートスタック

udpjdbc-ping-udptcpazureec2、および google トランスポートスタックは非推奨になりました。ユーザーは、直接の代替として TCP ベースの jdbc-ping スタックを使用する必要があります。

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 デプロイメントには次の変更が必要です。

  1. multi-site 機能が有効になっている場合、キャッシュ構成ファイルによって提供される distributed-cache 定義は無視されるため、ブループリントで概説されているように、cache-remote-* コマンドライン引数または Keycloak CR を介して外部 Infinispan デプロイメントへの接続を構成する必要があります。すべての remote-store 構成は、キャッシュ構成ファイルから削除する必要があります。

  2. 外部 Infinispan の現在のキャッシュ構成を確認し、Keycloak のドキュメントの最新バージョンで概説されている構成で更新します。以前のバージョンのキャッシュ構成では、サイト間のバックアップレプリケーションが失敗した場合に警告のみがログに記録されていましたが、新しい構成では、両方のサイトの状態が同期された状態に保たれるようになっています。2 つのサイト間の転送が失敗すると、呼び出し元にエラーが表示されます。そのため、サイト障害が発生した場合に 2 つのサイトを切り離すための監視を設定する必要があります。Keycloak 高可用性ガイドには、この設定方法に関するブループリントが含まれています。

  3. 以前のロードバランサー構成は Keycloak で引き続き機能しますが、クライアント側の DNS キャッシュによるフェイルオーバー時間の長期化を回避するために、既存の Route53 構成をアップグレードすることを検討してください。

  4. リモートストア構成でキャッシュ構成 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 (enabledlink_only ではない、hide_on_login としてマークされていないもの) を取得するクエリのパフォーマンスを向上させるために、新しいインデックスが IDENTITY_PROVIDER テーブルに追加されました。

テーブルに現在 300,000 を超えるエントリが含まれている場合、Keycloak は自動スキーマ移行中にデフォルトでインデックスの作成をスキップし、代わりに移行中に SQL ステートメントをコンソールにログ記録します。この場合、Keycloak の起動後に DB でステートメントを手動で実行する必要があります。

また、kc.org および hideOnLoginPage 構成属性が ID プロバイダー自体に移行され、プロバイダーを検索するときにクエリをより効率的に実行できるようになりました。そのため、API クライアントは IdentityProviderRepresentationgetOrganizationId/setOrganizationId および isHideOnLogin/setHideOnLogin メソッドを使用し、現在非推奨になっているレガシー構成属性を使用してこれらのプロパティを設定することは避ける必要があります。

GELF ロギングハンドラーの削除

GELF サポートはしばらくの間非推奨となっていましたが、このリリースで Keycloak から完全に削除されました。他のログハンドラーは利用可能であり、GELF の代替として使用することが完全にサポートされています (Syslog など)。詳細については、ロギングガイド を参照してください。

common テーマリソースのパスが変更されました

keycloak テーマの common リソースの一部のパスが変更されました。具体的には、サードパーティライブラリのリソースです。カスタムテーマを適宜更新してください

  • node_modules/patternfly/distvendor/patternfly-v3 になりました

  • node_modules/@patternfly/patternflyvendor/patternfly-v4 になりました

  • node_modules/@patternfly-v5/patternflyvendor/patternfly-v5 になりました

  • node_modules/rfc4648/libvendor/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 キャッシュ設定ファイルを、以下のキャッシュ sessionsclientSessionsofflineSessions、および 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 フラグなしで他のサーバーコマンド (startexportimport など) を実行することで実現できます。

アダプターおよび 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 管理クライアントを扱うためのいくつかのヘルパーメソッドを提供していました。ヘルパーメソッドを使用している場合は、必要に応じてアプリケーションにフォークすることが可能です。

JEE admin-client が削除されました

JEE admin-client が今回のリリースで削除されました。Jakarta admin-client のサポートは引き続き継続します。

資格情報の新しい汎用イベントタイプ

資格情報の更新 (UPDATE_CREDENTIAL) および削除 (REMOVE_CREDENTIAL) のための汎用イベントが追加されました。資格情報のタイプは、イベントの credential_type 属性で記述されています。新しいイベントタイプは、Email Event Listener でサポートされています。

以下のイベントタイプは非推奨となり、将来のバージョンで削除される予定です: UPDATE_PASSWORDUPDATE_PASSWORD_ERRORUPDATE_TOTPUPDATE_TOTP_ERRORREMOVE_TOTPREMOVE_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 ドメイン経由で提供されるコンテキストであるセキュアコンテキストでのみ利用可能です。非セキュアコンテキストでライブラリを使用している場合は、セキュアコンテキストを使用するように開発環境を更新する必要があります。

ビルド時オプションのより厳格な起動動作

起動時に指定されたビルド時オプションが、最後の最適化された Keycloak ビルド中にサーバーイメージに永続化された値と異なる場合、Keycloak は起動に失敗するようになりました。以前は、そのような場合に警告メッセージが表示されていました。

機能の名前変更

機能バージョンにより、機能 account3admin2、および login2 の名前が変更されました。機能を無効にする場合、バージョンを使用する必要はありません。たとえば、管理コンソールは --features-disabled=admin で無効になります。

login の特定のバージョンを使用するには、--features=login:v1 を使用します。

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>
hostname-url <url>
hostname-path <path>
hostname-port <port>

hostname <hostname/url>

hostname-admin <hostname>
hostname-admin-url <url>

hostname-admin <url>

hostname-strict-backchannel <true/false>

hostname-backchannel-dynamic <true/false>

ご覧のとおり、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-url

hostname-admin-url

hostname-path

hostname-port

hostname-strict-backchannel

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 のアップグレード中にユーザーセッションを移行するには、次の手順を実行します。

  1. 実行中の古い Keycloak インスタンスをすべて停止します。

  2. バックアップを作成します。

    • Keycloak のデータベースのバックアップを作成します。

    • JDBC 永続性を使用している場合は、セッションの移行を再試行できるように、そのデータベースのバックアップを作成します。

    • 外部 Infinispan を使用している場合は、セッションの移行を再試行できるように、そのデータのバックアップを作成します。

  3. 永続ユーザーセッション機能を有効にして、新しい Keycloak インスタンスを起動します。

    最初に起動するノードは、

    1. データベースをスキーマバージョン 25 に移行します。

    2. リモート Infinispan または Keycloak の組み込みキャッシュ用に構成された JDBC 永続性のいずれかから、すべてのセッション情報を Keycloak のデータベースにコピーします。

      データは、offline_flagfalse に設定された offline_user_session および offline_client_session テーブルに格納されます。

    3. キャッシュをクリアします。

      これには、外部 Infinispan (使用されている場合) のキャッシュのクリア、および JDBC 永続性 (使用されている場合) のクリアが含まれます。

  4. キャッシュ sessions および clientSessions の Keycloak のキャッシュ構成 XML を更新します。

    • JDBC 永続性を使用している場合は、JDBC 永続性の構成を削除します。

    • リモート Infinispan がシングルサイトセットアップで Keycloak の再起動間でユーザーセッションを維持するためだけに使用されていた場合は、これらのキャッシュのリモート Infinispan 構成を削除します。

    リモート Infinispan がマルチサイトセットアップで使用されている場合は、メモリ内のエントリ数を構成することで、外部 Infinispan によるリソース消費を削減できます。Infinispan Operator を使用した HA 用 Infinispan のデプロイ ガイドで概説されている設定を使用してください。
  5. 新しいキャッシュ構成 XML をアクティブにするための Keycloak のローリング再起動。

既存のユーザーのサインアウト

以前のバージョンおよび機能が無効になっている場合、すべての Keycloak ノードを再起動すると、すべてのユーザーがログアウトしました。persistent-user-sessions 機能が有効になっているレルムのすべてのオンラインユーザーセッションをサインアウトするには、以前と同様に次の手順を使用します。

  1. 管理コンソールにログインします。

  2. メニューエントリ セッション を選択します。

  3. アクション すべてのアクティブなセッションをサインアウト を選択します。

組み込みキャッシュのメトリクスがデフォルトで有効になりました

組み込みキャッシュのメトリクスがデフォルトで有効になりました。レイテンシのヒストグラムを有効にするには、オプション cache-metrics-histograms-enabledtrue に設定します。

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 の内部キャッシュからユーザーがクリアされるため、データベースレベルでの読み取りアクティビティの増加も確認できます。このデータベースアクティビティの増加は、再ハッシュされたユーザーのパスワードが増えるにつれて、時間の経過とともに減少します。

更新された JVM ガベージコレクション設定

Argon2 のメモリ集約的な性質をサポートするために、デフォルトの GC を ParallelGC から G1GC に更新して、ヒープ使用率を向上させました。このアップグレード後、JVM ヒープ使用率を注意深く監視してください。特定のワークロードに応じて、追加のチューニングが必要になる場合があります。

HTTP レスポンスを消費する際のメモリ使用量の制限

ブローカリングなどの一部のシナリオでは、Keycloak は HTTP を使用して外部サーバーと通信します。これらのプロバイダーが過剰なデータを送信した場合のサービス拒否を回避するために、Keycloak はデフォルトでレスポンスを 10 MB に制限するようになりました。

ユーザーは、プロバイダー構成オプション spi-connections-http-client-default-max-consumed-response-size を設定することで、この制限を構成できます。

消費されるレスポンスを 1 MB に制限する例
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 オプションをランタイムで指定

オプション cachecache-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 アダプターを使用している場合は、クライアントスコープを使用して、必要なクライアントにマッパーを追加する必要があります。

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 で手動で実行する必要があります。

異なる制限を構成する方法の詳細については、アップグレードガイドを参照してください。

AccessTokenIDToken、および 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 である必要があるため、意味がありません。

メソッド getExpSingleUseObjectKeyModel に追加

AccessTokenIDToken、および 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 を介してユーザー属性を更新する場合、usernameemailfirstName、および 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 仕様ではカバーされていないことに注意してください。

資格情報を削除するための非推奨のアカウント REST エンドポイント

ユーザーの資格情報を削除するためのアカウント REST エンドポイントは非推奨になりました。このバージョン以降、アカウントコンソールはこのエンドポイントを使用しなくなりました。ユーザーがユーザーの資格情報を削除したい場合にアカウントコンソールによってトリガーされる、Delete Credential アプリケーション開始アクションに置き換えられました。

24.0.2 への移行

パスワードハッシュの変更

Keycloak 24.0.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 に設定されています。

これらのプロパティは、以前はナビゲーション要素に使用されていましたが、現在は存在しません。組み込みテーマを拡張している場合は、これらのプロパティは効果がなくなったため、theme.properties ファイルから削除する必要があります。

アセットが 'common' リソースからロードされるようになりました

背景、ロゴ、ファビコンなどの画像は、テーマリソースではなく、'common' リソースからロードされるようになりました。この変更は、組み込みテーマを拡張していて、これらの画像を上書きしている場合、テーマの 'common' リソースに移動し、theme.properties ファイルを更新して新しいパスを含める必要があることを意味します。

# This defaults to 'common/keycloak' if not set.
import=common/your-theme-name

アカウントコンソールテーマのカスタマイズの変更

非推奨になったバージョン 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 に変更されました。

  • idicon、および 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`、emailfirstName、および 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:attributesome/attribute などの属性名を持つユーザーを作成できました。ユーザープロファイルは、意図的にユーザープロファイル設定でこのような奇妙な名前を持つ属性の作成を許可していません。そのため、レルムの 管理外属性 を設定し、管理者(理想的には)またはエンドユーザー(本当に必要な場合)の管理外属性を有効にする必要がある場合があります。ただし、そのような属性名の使用は強く推奨されません。

デフォルトで有効になっているプロファイル検証必須アクション

新規レルムでは、verify-profile 必須アクションがデフォルトで有効になっています。ただし、以前のバージョンから移行する場合、既存のレルムでは、この verify-profile アクションの状態は以前と同じになります。通常、以前のバージョンではデフォルトで無効になっていたため、無効になっていることを意味します。この必須アクションの詳細については、ユーザープロファイルドキュメントを参照してください。

ユーザープロファイル SPI の破壊的な変更

拡張機能でユーザープロファイル SPI を使用している場合は、このリリースで導入された API の変更の影響を受ける可能性があります。

org.keycloak.userprofile.Attributes インターフェースには、次の変更が含まれています。

  • メソッド getValues は、通常の Java Map からの同じ操作とより一致するように 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.ftlregister.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 conveyanceDirect バリデーションに構成されている場合に失敗する可能性があります。以前は、トラストストアプロバイダーが構成されていない場合、受信証明書は検証されませんでした。しかし、現在は常にこの検証が実行されます。ドングルから送信された証明書チェーンが Keycloak によって信頼されていないため、登録は invalid cert path エラーで失敗します。認証器の認証局は、attestation を正しく実行するためにトラストストアプロバイダーに存在する必要があります。

非推奨の --proxy オプション

--proxy オプションは非推奨となり、将来のリリースで削除される予定です。次の表は、非推奨のオプションがサポートされているオプションにどのようにマッピングされるかを示しています。

非推奨の使用法 新しい使用法

kc.sh (proxy オプションが設定されていない場合)

kc.sh

kc.sh --proxy none

kc.sh

kc.sh --proxy edge

kc.sh --proxy-headers forwarded|xforwarded --http-enabled true

kc.sh --proxy passthrough

kc.sh --hostname-port 80|443 (HTTPS が使用されている場合によって異なります)

kc.sh --proxy reencrypt

kc.sh --proxy-headers forwarded|xforwarded

セキュリティ強化のため、--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.UserRepresentationorg.keycloak.representations.account.UserRepresentation の両方の表現クラスが変更され、ルートユーザー属性(usernameemailfirstNamelastNamelocale など)は、Admin および Account API に表現ペイロードをフェッチまたは送信するときに一貫した表現を持つようになりました。

usernameemailfirstNamelastName、および 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 経由でこれらの属性を変更できるようにするには、次の手順を実行します。

  1. 上記で特定された属性をレルムのユーザープロファイルで管理属性として宣言します。

  2. 前の手順で追加された各属性に length バリデーターを定義し、属性値の目的の最小長と最大長を指定します。バイナリ値の場合、Keycloak のバイナリ値の内部 base64 エンコードのオーバーヘッドを考慮して、予想されるバイナリ長に 33% を加算します。

カスタムユーザー ストレージ プロバイダーの追加の移行手順

これは、次のすべての基準に一致するインストール用です

  • Keycloak のデータベースとして MariaDB または MySQL を実行しています。

  • VALUE 列に 2048 文字を超えるコンテンツを含むテーブル FED_USER_ATTRIBUTE のエントリ。このテーブルは、フェデレーションが有効になっているカスタムユーザープロバイダーに使用されます。

  • 長い属性は、管理者またはユーザーによって、管理コンソールまたはアカウントコンソールを介して変更されます。

UI および REST API 経由でこれらの属性を変更できるようにするには、次の手順を実行します。

  1. 上記で特定された属性をレルムのユーザープロファイルで管理属性として宣言します。

  2. 前の手順で追加された各属性に 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 アルゴリズム 古い反復回数 新しい反復回数

pbkdf2

PBKDF2WithHmacSHA1

20.000

1.300.000

pbkdf2-sha256

PBKDF2WithHmacSHA256

27.500

600.000

pbkdf2-sha512

PBKDF2WithHmacSHA512

30.000

210.000

レルムが hashAlgorithmhashIterations を使用してパスワードポリシーを明示的に構成していない場合、新しい構成は次回のパスワードベースのログイン時、またはユーザーパスワードが作成または更新されたときに有効になります。

新しいパスワードハッシュ構成のパフォーマンス

Intel i9-8950HK CPU (12) @ 4.800GHz を搭載したマシンでのテストでは、1000 個のパスワードのハッシュ処理における平均時間差が次のようになりました (3 回の実行の平均)。PBKDF2WithHmacSHA1 の平均時間は、実行時間が長いため、より少ないパスワード数で計算されたことに注意してください。

プロバイダー ID アルゴリズム 古い期間 新しい期間

pbkdf2

PBKDF2WithHmacSHA1

122ms

3.114ms

+2.992ms

pbkdf2-sha256

PBKDF2WithHmacSHA256

20ms

451ms

+431ms

pbkdf2-sha512

PBKDF2WithHmacSHA512

33ms

224ms

+191ms

pbkdf2 プロバイダーのユーザーは、許容可能なパフォーマンスを取り戻すために、ハッシュ反復回数を明示的に減らす必要がある場合があります。これは、レルムのパスワードポリシーでハッシュ反復回数を明示的に構成することで実行できます。

予想される全体的な CPU 使用率の増加と一時的なデータベースアクティビティの増加

Keycloak 高可用性ガイドの CPU およびメモリリソースのサイジングに関するコンセプトが更新され、新しいハッシュデフォルトを反映するようになりました。パスワードベースのログインあたりの CPU 使用率は、テストでは 5 倍に増加しました。これには、変更されたパスワードハッシュと変更されていない TLS 接続処理の両方が含まれています。全体的な CPU の増加は、Keycloak の他のアクティビティ(アクセストークンとクライアントクレデンシャルの付与の更新など)の平均化効果により、約 2 ~ 3 倍になるはずです。それでも、これはインストールの固有のワークロードに依存します。

アップグレード後、パスワードベースのログイン中に、ユーザーのパスワードは新しいハッシュアルゴリズムとハッシュ反復回数で一度だけ再ハッシュされ、データベースで更新されます。これにより、ユーザーが Keycloak の内部キャッシュからクリアされるため、データベースレベルでの読み取りアクティビティの増加も確認できます。このデータベースアクティビティの増加は、再ハッシュされるユーザーのパスワードが増えるにつれて、時間の経過とともに減少します。

古い pbkdf2-sha256 パスワードハッシュを引き続き使用する方法

レルムの古いパスワードハッシュを維持するには、レルムのパスワードポリシーで hashAlgorithmhashIterations を明示的に指定します。

  • ハッシュアルゴリズム: pbkdf2-sha256

  • ハッシュ反復回数: 27500

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.4 への移行

Groups.getSubGroups briefRepresentation パラメータの処理の修正

バージョン 23.0.0 では、Groups リソースに新しいエンドポイント getSubGroups ("children") が導入されました。ここでは、パラメータ briefRepresentation はサブグループの完全な表現の取得を意味していました。意味が変更され、簡易表現が返されるようになりました。

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://127.0.0.1:5432/keycloak?ssl=false&connectTimeout=30\"" --db-password keycloak --hostname localhost

単一のエスケープを使用してください

bin/kc.sh start --db postgres --db-username keycloak --db-url "jdbc:postgresql://127.0.0.1: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 クラスを使用した場合を除き、通常、この変更に関連して追加のアクションは必要ありません。

データプロバイダーとモデルからの非推奨メソッド

  • RealmModel#getTopLevelGroupsStream() およびオーバーロードされたメソッドが非推奨になりました

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.4 への移行

メールローカルパートの最大長を指定するための新しいパラメーター

下位互換性を考慮して、メールローカルパートの最大長を設定するための新しいパラメーター --spi-user-profile-declarative-user-profile-max-email-local-part-length が追加されました。デフォルト値は 64 です。使用例

kc.[sh|bat] start --spi-user-profile-declarative-user-profile-max-email-local-part-length=100 ...

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.securityjavax.netjavax.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 です。

Jakarta EE サポート
移行前
<dependency>
    <groupId>org.keycloak</groupId>
    <artifactId>keycloak-admin-client-jakarta</artifactId>
    <version>21.0.0</version>
</dependency>
移行後
<dependency>
    <groupId>org.keycloak</groupId>
    <artifactId>keycloak-admin-client</artifactId>
    <version>22.0.0</version>
</dependency>
Java EE サポート
移行前
<dependency>
    <groupId>org.keycloak</groupId>
    <artifactId>keycloak-admin-client</artifactId>
    <version>21.0.0</version>
</dependency>
移行後
<dependency>
    <groupId>org.keycloak</groupId>
    <artifactId>keycloak-admin-client-jee</artifactId>
    <version>22.0.0</version>
</dependency>

パススループロキシモードの変更

モード **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 データベースのクエリ時にページネーションメカニズムを使用します。ユーザーの検索は、ローカルデータベースの検索と一貫性がある必要があります。

このリリース以降、LDAPStorageProviderUserQueryProvider ではなく、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-redirectbasic-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-clientokio-jvmokhttpcommons-langcommons-compressjboss-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.2 への移行

利用規約ユーザー属性の移行

terms_and_conditions ユーザー属性は、21.0.0 で誤って大文字に変更されました。このバージョンでは、ユーザー属性は小文字に戻ります。属性の値は、利用規約ページに同意したときに設定されます。

カスタム拡張機能がこの属性に依存している場合は、コードを調整して、terms_and_conditionsTERMS_AND_CONDITIONS の両方の属性を確認する必要がある場合があります。

21.0.0 への移行

Keycloak はメトリクスに Micrometer を使用

Keycloak は、Prometheus 形式でメトリクスをエクスポートするオプションのメトリクスエンドポイントを提供します。このリリースでは、このデータを提供する実装が SmallRye から Micrometer に切り替えられました。Micrometer は、Quarkus に推奨されるメトリクスライブラリ です。

この変更により、メトリクスは名前が変更されました。次の表にいくつかの例を示します。

アップグレードする前に、エンドポイントから返されるすべてのメトリクスを、変更前と変更後で確認し、ダッシュボードとアラートでの使用状況を更新することをお勧めします。

表 1. 変更されたメトリクス名の例
古いメトリクス名 新しいメトリクス名

base_gc_total

jvm_gc_pause_seconds_count

base_gc_time_total_seconds

jvm_gc_pause_seconds_sum

base_thread_count

jvm_threads_live_threads

vendor_agroal_*

agroal_*

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-sha1http://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 への移行

RESTEasy バージョンの更新

Keycloak 管理 REST クライアントの RESTEasy バージョンを次のメジャーバージョンに更新しました。

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
Hostname オプションが追加されました

最後に重要なことですが、hostname オプションも変更されました。

spec:
    ...
  hostname:
    hostname: [keycloak-server-hostname]
    admin: [admin-console-hostname]
    adminUrl: [admin-console-base-url]
    strict: [true|false]
    strictBackchannel: [true|false]
一部のフィールドが不要になりました

hostname および tlsSecret フィールドは、Quarkus ディストリビューション構成と整合させるためにオプションになりました。これにより、これらのフィールドに INSECURE-DISABLE 特殊値を設定する可能性も削除しました。hostname チェックを無効にして HTTP を有効にするには、Quarkus ディストリビューションと同じアプローチに従ってください。つまり、strict: falsestrictBackchannel: false、および httpEnabled: true フィールドを設定します。

OLM チャネルが fast に変更されました

Keycloak Operator Lifecycle Manager のデフォルトチャネルが fast に変更されました。

データプロバイダーとモデルからの非推奨メソッドが削除されました

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 Unauthorizedinvalid_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-spiserver-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() への呼び出しを変更するのが最良のオプションです。新しいメソッドは、ローカルセットアップでキャッシュが有効になっている場合にキャッシュが含まれるため、ここでセマンティクスが変更されることに注意してください。

移行前: 例外をスローするようになった非推奨の API へのアクセス
session.userLocalStorage();
移行後: 新しい API へのアクセス 発信者はレガシーストレージ API に依存しません
session.users();
レガシーストアに依存する既存のプロバイダーの移行

カスタムプロバイダーが特定のプロバイダーのモードを区別する必要があるまれなケースでは、非推奨となったオブジェクトへのアクセスは、LegacyStoreManagersデータストアプロバイダーを使用することで提供されます。このオプションは、レガシーモジュールがデプロイメントの一部である場合にのみ利用可能です。

移行前: 例外をスローするようになった非推奨の API へのアクセス
session.userLocalStorage();
移行後: LegacyStoreManagers API を介して古い機能にアクセスする
((LegacyDatastoreProvider) session.getProvider(DatastoreProvider.class)).userLocalStorage();

一部のユーザーストレージ関連 API は、利便性のために org.keycloak.storage.UserStorageUtil にラップされています。

カスタムストレージプロバイダーの作成

カスタムストレージプロバイダーを作成するための API は、技術プレビューとして利用可能ですが、まだ完全に安定化されていません。詳細については、MapStorageProvider SPI およびその Javadoc を参照してください。新しい API の利用可能性は、次期 Keycloak バージョンの優先事項です。

RealmModel の変更

メソッド getUserStorageProvidersgetUserStorageProvidersStreamgetClientStorageProvidersgetClientStorageProvidersStreamgetRoleStorageProviders、および getRoleStorageProvidersStream が削除されました。これらのメソッドに依存し、レガシーストレージが有効になっている状態で実行されるコードは、インスタンスを次のようにキャストする必要があります。

移行前: API の変更によりコードがコンパイルされません
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);
移行後: API を直接使用する
// 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();
移行後: 無効化 API を使用する
session.invalidate(InvalidationHandler.ObjectType.REALM, realm.getId());
ユーザーのクレデンシャル管理

ユーザーのクレデンシャルは、以前は session.userCredentialManager().method(realm, user, ...) を使用して管理されていました。新しい方法は、user.credentialManager().method(...) を活用することです。この形式は、クレデンシャル機能をユーザーの API に近づけ、レルムとストレージに関するユーザーのクレデンシャルの場所に関する事前の知識に依存しません。

古い API は非推奨となり、レガシーストレージがデプロイメントで有効になっている場合にのみ機能します。新しい API は、古いストレージと新しいストレージの両方で機能します。

移行前: 非推奨の API にアクセスする
session.userCredentialManager().createCredential(realm, user, credentialModel)
移行後: 新しい API にアクセスする
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;
            }
        };
    }
}
移行後: レガシーストア用の API 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 ドキュメントも参照してください。

新しい Keycloak Operator におけるデプロイメントの変更

新しい Keycloak Operator は、Keycloak デプロイメントに Deployment の代わりに StatefulSet を使用するようになりました。このリリースでは Operator が技術プレビューであるため、自動移行は行われません。18.0.z で新しい Operator を使用している場合は、19.0.0 へのアップグレード後に Keycloak CR をバックアップ、削除、再作成してください。

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 を更新することで解決できるはずです。

リソース

破壊的変更があることが判明しているコンポーネント

  • Alert

  • action prop が actionClose に変更されました

  • Expandable

  • ExpandableSection に名称変更

  • Title

  • size 属性が TitleSizes を使用するようになりました

  • DataListContent

  • noPaddinghasNoPadding に変更されました

  • Grid, Stack, Level, Gallery

  • gutter 属性が hasGutter に変更されました

  • Modal

  • サイズ制御が、例えば isLarge から、ModalVariant (例えば variant={ModalVariant.large}) を使用するように変更されました

  • Select

  • ariaLabelTypeAheadtypeAheadAriaLabel

  • isExpandedisOpen

  • ariaLabelledByaria-labelledby

  • DataListContent

  • noPaddinghasNoPadding

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.propertiesconf/keycloak.conf に変更されました。これにより、構成ファイルと CLI 引数の間の構成キーが統一されます。

  • build optionsruntime 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_PROXYHTTPS_PROXY、および NO_PROXY 環境変数を尊重するようになりました。この変更により、例えば HTTP_PROXY 変数が定義されているが、SPI 構成で明示的なプロキシマッピングが指定されていない場合、プロキシサーバーが予期せず使用される可能性があります。Keycloak がこれらの環境変数を使用しないようにするには、すべてリクエストに対して .*;NO_PROXY としてプロキシルートなしを明示的に作成できます。

Keycloak Operator での非推奨機能

今回のリリースでは、Keycloak Operator の一部の機能を非推奨にしたり、サポート対象外としてマークしたりしました。これは、Backup CRD とオペレーター管理の Postgres データベースに関係します。

サポート対象外の Metrics 拡張機能を含む Keycloak Operator の例

以前は、Keycloak Operator による Keycloak CR の作成例に、サポート対象外のメトリクス拡張機能が追加されていました。これは削除されました。

14.0.0 への移行

クライアントポリシーの移行

クライアントポリシー機能は、Keycloak 12 以降のプレビュー機能であり、適切なサポートがありませんでした。この機能を試して、Keycloak 12 または Keycloak 13 でクライアントポリシーまたはクライアントプロファイルを構成した場合、新しいバージョンでクライアントポリシーとクライアントプロファイルを再度構成する必要があります。構成の形式は、プレビューのみであったため大幅に変更されており、Keycloak 12 または Keycloak 13 で作成されたクライアントポリシーとクライアントプロファイルの自動移行は提供していません。

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 サーバーのダウンロード セクションに従って、構成ファイルの移行を自動的に処理する必要があります。ただし、独自の構成変更を行った場合に必要になる可能性のある最も重要な変更を次に示します。

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 サーバーのダウンロード セクションに従って、構成ファイルの移行を自動的に処理する必要があります。例えば、独自の構成変更を行ったため、詳細が必要な場合は、最も重要な変更のリストを次に示します。

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のフィールドであるusernameemailfirstName、およびlastNameは、今後のバージョンでKeycloakにさらに洗練されたユーザープロファイルを追加するための準備として、カスタム属性に移行されました。データベースにそれらの正確な名前のカスタム属性を持つユーザーが含まれている場合、アップグレードする前にカスタム属性を移行する必要があります。この移行は自動的には行われません。そうしないと、それらはデータベースから読み取られなくなり、削除される可能性があります。この状況は、usernameUserModel.getFirstAttribute(UserModel.USERNAME)を介してアクセスおよび設定できるようになったことも意味します。他のフィールドにも同様の影響があります。UserModelを直接的または間接的にサブクラス化するSPIの実装者は、setUsernamesetSingleAttribute(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_endpointintrospection_endpointをアドバタイズしていました。後者はRFC-8414で定義されているものです。前者は以前に非推奨となり、現在は削除されました。

9.0.1への移行

JavaScriptアダプターのレガシーPromise

JavaScriptアダプターでpromiseTypeを設定する必要がなくなり、両方が同時に利用可能になりました。レガシーAPI(successerror)は将来のある時点で削除されるため、ネイティブPromise API(thencatch)を使用するようにアプリケーションをできるだけ早く更新することを推奨します。

トップレベルグループの重複

バージョン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への移行

ユーザーロケールの処理の改善

ログインページのロケールの選択方法、およびユーザーのロケールが更新されるタイミングに関して、多くの改善が行われました。

詳細については、サーバー管理ガイドを参照してください。

トークン表現Javaクラスの非推奨メソッド

2038年には、intは1970年からの秒数を保持できなくなるため、これらをlong値に更新する作業を進めています。さらに、トークン表現におけるint値の処理に関連する別の問題が存在します。intはデフォルトでJSON表現で0になりますが、含まれるべきではありません。

非推奨になった正確なメソッドと代替メソッドの詳細については、JavaDocを参照してください。

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テンプレートの変更を再確認し、それに応じてテンプレートを調整することを推奨します。

ユーザー資格情報の変更

ユーザー資格情報の保存に関する柔軟性を高めました。とりわけ、すべてのユーザーは同じタイプの複数の資格情報、たとえば複数のOTP資格情報を持つことができます。その結果、データベーススキーマにいくつかの変更が加えられました。ただし、以前のバージョンの資格情報は新しい形式に自動的に更新されるはずであり、ユーザーは以前のバージョンで設定されたパスワードまたはOTP資格情報で引き続きログインできるはずです。

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への移行

新しいデフォルトクライアントスコープ

新しいレルムデフォルトクライアントスコープrolesweb-originsを追加しました。これらのクライアントスコープには、ユーザーのロールと許可されたWebオリジンをトークンに追加するプロトコルマッパーが含まれています。移行中に、これらのクライアントスコープは、すべてのOpenID Connectクライアントにデフォルトクライアントスコープとして自動的に追加されるはずです。したがって、データベースの移行が完了した後、セットアップは必要ありません。

プロトコルマッパーSPIの追加

これに関連して、(サポートされていない)プロトコルマッパーSPIに小さな追加があります。カスタムProtocolMapperを実装した場合にのみ影響を受ける可能性があります。ProtocolMapperインターフェースに新しいgetPriority()メソッドが導入されました。このメソッドには、0を返すデフォルト実装が設定されています。プロトコルマッパーの実装がアクセストークンのrealmAccessまたはresourceAccessプロパティのロールに依存している場合は、マッパーの優先度を上げる必要がある場合があります。

オーディエンス解決

認証されたユーザーがトークンに少なくとも1つのクライアントロールを持っているすべてのクライアントのオーディエンスが、アクセストークンのaudクレームに自動的に追加されるようになりました。一方、アクセストークンには、発行されたフロントエンドクライアントのオーディエンスが自動的に含まれない場合があります。詳細については、サーバー管理ガイドをお読みください。

JavaScriptアダプターPromise

ネイティブJavaScript PromiseをJavaScriptアダプターで使用するには、initオプションでpromiseTypenativeに設定する必要があります。

過去には、ネイティブ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.3.0への移行

ホスト名設定

以前のバージョンでは、許可されたホスト名を指定するためにフィルターを使用することが推奨されていました。固定ホスト名を設定できるようになり、有効なホスト名が使用されていることを確認することが容易になり、内部アプリケーションが代替URL(たとえば内部IPアドレス)を介してKeycloakを呼び出すことも可能になりました。本番環境ではこのアプローチに切り替えることを推奨します。

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キャッシュauthenticationSessionsactionTokensを導入することです。移行CLIを使用している場合は、standalone(-ha).xmlファイルが自動的に移行されるため、あまり気にする必要はありません。

2番目の変更は、認証SPIのメソッドのいくつかの署名の変更です。カスタムAuthenticatorまたはRequiredActionProviderを使用している場合は影響を受ける可能性があります。クラスAuthenticationFlowContextRequiredActionContextで、クライアントセッションの代わりに認証セッションを取得できるようになりました。

スティッキーセッションの初期サポートも追加しました。ロードバランサー/プロキシサーバーを変更し、それによってパフォーマンスが低下したくない場合は、ロードバランサー/プロキシサーバーを設定することをお勧めします。ルートは新しい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.5.0 への移行

Infinispan キャッシュへの変更

standalone.xml または standalone-ha.xml 設定ファイルの infinispan サブシステムで定義された realms キャッシュは、デフォルトで 10000 レコードでのエビクションを持つようになりました。これは users キャッシュと同じデフォルトです。

また、authorization キャッシュはデフォルトでエビクションがなくなりました。

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 はマイナーリリース間で変更される可能性があり、またその権利を留保します。

SAML アサーションのキー暗号化アルゴリズム

SAML アサーションおよびドキュメントのキーは、RSA-OAEP 暗号化方式を使用して暗号化されるようになりました。暗号化されたアサーションを使用する場合は、サービスプロバイダーがこの暗号化方式を理解していることを確認してください。SP が新しい方式を処理できないというありそうもない場合に備えて、システムプロパティ keycloak.saml.key_trans.rsa_v1.5true に設定して起動すると、Keycloak でレガシー RSA-v1.5 暗号化方式を使用するようにできます。

Infinispan キャッシュ realms および users は常にローカル

Keycloak をクラスターで使用している場合でも、standalone-ha.xml の infinispan サブシステムで定義されたキャッシュ realms および users は常にローカルキャッシュになりました。個別のキャッシュ work が存在し、クラスターノード間で無効化メッセージを送信し、基盤となる realms および users キャッシュのどのレコードを無効化する必要があるかをクラスター全体に通知します。

2.3.0 への移行

ページネーションされたエンドポイントのデフォルトの最大結果数

ページネーションをサポートするすべての Admin REST API エンドポイントには、デフォルトの最大結果数が 100 に設定されるようになりました。100 を超えるエントリを返す場合は、?max=<RESULTS> で明示的に指定する必要があります。

2.3.0 リリースでは、公開鍵ローテーションのサポートを追加しました。管理者が Keycloak 管理コンソールでレルムキーをローテーションすると、クライアントアダプターはそれを認識し、Keycloak から新しい公開鍵を自動的にダウンロードできます。ただし、この新しいキーの自動ダウンロードは、アダプターにハードコードされた公開鍵を持つ realm-public-key オプションがない場合にのみ実行されます。このため、アダプター設定で realm-public-key オプションをもう使用しないことをお勧めします。

このオプションはまだサポートされていますが、アダプター設定にハードコードされた公開鍵を持ち、Keycloak から公開鍵をダウンロードしない場合にのみ役立つ場合があります。理論的には、アダプターと Keycloak の間に信頼できないネットワークがある場合に、中間者攻撃を回避するための理由の 1 つになりますが、その場合は、HTTPS を使用する方がはるかに良いオプションであり、アダプターと Keycloak 間のすべてのリクエストを保護します。

Infinispan キャッシュ keys の追加

このリリースでは、standalone.xml または standalone-ha.xml 設定ファイルで定義されている infinispan サブシステムに新しいキャッシュ keys を追加しました。これには、定義されたエビクションと有効期限もあります。このキャッシュは、サーバーによって信頼されているエンティティ (署名付き JWT で認証を使用する ID プロバイダーまたはクライアント) の外部公開鍵をキャッシュするために内部的に使用されます。

2.2.0 への移行

databaseSchema プロパティは非推奨

JPA と Mongo の両方の databaseSchema プロパティは、現在非推奨であり、initializeEmpty および migrationStrategy置き換えられましたinitializeEmptytrue または false に設定でき、空のデータベースを初期化するかどうかを制御します。migrationStrategy は、updatevalidate、および manual に設定できます。manual はリレーショナルデータベースでのみサポートされており、データベーススキーマに必要な変更を含む SQL ファイルを書き込みます。Oracle データベースの場合、作成された SQL ファイルには、Oracle SQL クライアントによって理解される SET DEFINE OFF コマンドが含まれていることに注意してください。スクリプトが他のクライアントによって使用される場合は、変数の展開を無効にするツールの同等のコマンドでそれらの行を置き換えるか、そのような機能が適用できない場合は完全に削除してください。

クライアントの有効なリダイレクト URI の変更

次のシナリオが影響を受けます

  • クエリコンポーネントを持つ有効なリダイレクト URI がクライアントに保存されている場合 (例: https://127.0.0.1/auth?foo=bar)、認証リクエストの redirect_uri は、この URI (またはこのクライアントに登録されている他の URI) と完全に一致する必要があります。

  • クエリコンポーネントなしの有効なリダイレクト URI がクライアントに保存されている場合、redirect_uri も完全に一致する必要があります。

  • 登録された有効なリダイレクト URI のワイルドカードは、この URI にクエリコンポーネントが存在する場合はサポートされなくなったため、redirect_uri はこの保存された URI と完全に一致する必要があります。

  • 登録された有効なリダイレクト URI のフラグメント (https://127.0.0.1/auth#fragment など) は許可されなくなりました。

ID プロバイダーからデフォルトで認証を削除

ID プロバイダーには、デフォルトの認証プロバイダーとして設定するオプションがなくなりました。代わりに、[認証] に移動し、Browser フローを選択して、Identity Provider Redirector を構成します。これには、デフォルトの ID プロバイダーを設定するオプションがあります。

2.0.0 への移行

1.0.0.Final からのアップグレードはサポートされなくなりました

1.0.0.Final からのアップグレードはサポートされなくなりました。このバージョンにアップグレードするには、2.0.0 にアップグレードする前に 1.9.8.Final にアップグレードしてください。

1.9.5 への移行

デフォルトのパスワードハッシュ間隔が 20K に増加

新しいレルムのデフォルトのパスワードハッシュ間隔が 20K (以前は 1 から) に増加しました。この変更は、ユーザーが認証を行う際のパフォーマンスに影響を与えます。たとえば、古いデフォルト (1) では、パスワードのハッシュ化に 1 ミリ秒もかかりませんが、新しいデフォルト (20K) では、同じ操作に 50〜100 ミリ秒かかる場合があります。

1.9.3 への移行

ユーザー追加スクリプトの名前変更

Keycloak に管理者ユーザーを追加するスクリプトの名前が add-user-keycloak に変更されました。

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 の新しいイントロスペクトエンドポイントに置き換えられたトークン検証エンドポイントにも適用されます。

テーマテンプレートの更新

template.ftl のフィードバックが移動され、形式がわずかに変更されました。

モジュールとソースコードの再編成

モジュールとソースコードのほとんどは、2 つの Maven モジュール (keycloak-server-spi と keycloak-services) に統合されました。SPI インターフェースは server-spi にあり、実装は keycloak-services にあります。すべての JPA 依存モジュールは keycloak-model-jpa の下に統合されました。mongo および Infinispan も、モジュール keycloak-model-mongo および keycloak-model-infinispan の下に統合されました。

アダプターの場合、ログイン後にセッション ID が変更されました

セキュリティ攻撃ベクトルをプラグインするために、それをサポートするプラットフォーム (Tomcat 8、Undertow/WildFly) の場合、Keycloak OIDC および SAML アダプターはログイン後にセッション ID を変更します。この動作をオフにするには、アダプター構成スイッチを確認してください。

SAML SP クライアントアダプターの変更

Keycloak SAML SP クライアントアダプターには、IDP に登録される特定のエンドポイント /saml が必要になりました。

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 サーバーが含まれています。また、すべてのドキュメントと例が含まれています。

データベースの変更 (2 回目)

このリリースには、データベースへの変更が再び多数含まれています。最大の変更は、アプリケーションと OAuth クライアントの統合です。アップグレードする前にデータベースをバックアップすることを忘れないでください。

アプリケーションと OAuth クライアントの統合

アプリケーションと OAuth クライアントが クライアント に統合されました。管理コンソールの UI とデータベースも更新されました。データベースからのデータは自動的に更新されるはずです。以前に設定されたアプリケーションは、同意が必要 スイッチがオフのクライアントに変換され、OAuth クライアントはこのスイッチがオンのクライアントに変換されます。

1.1.0.Final から 1.2.0.Beta1 への移行

データベースの変更 (3 回目)

このリリースには、データベースへの変更が多数含まれています。アップグレードする前にデータベースをバックアップすることを忘れないでください。

アクセスおよび 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 サーバーのアップグレード

アダプターをアップグレードする前に、サーバーをアップグレードします。

アップグレードの準備

サーバーをアップグレードする前に、次の手順を実行してください。

手順
  1. Keycloak をシャットダウンします。

  2. 古いインストール(構成、テーマなど)をバックアップします。

  3. XA トランザクションが有効になっている場合は、未処理のトランザクションを処理し、data/transaction-logs/ トランザクションディレクトリを削除します。

  4. リレーショナルデータベースのドキュメントの手順に従ってデータベースをバックアップします。

    サーバーをアップグレードすると、データベースは古いサーバーと互換性がなくなります。アップグレードを元に戻す必要がある場合は、まず古いインストールを復元し、次にバックアップコピーからデータベースを復元します。

現在のセットアップで persistent-user-sessions 機能が無効になっており、サーバーがアップグレードされた場合、オフラインユーザーセッションを除くすべてのユーザーセッションが失われます。これらのセッションを所有するユーザーは、再度ログインする必要があります。persistent-user-sessions 機能は、26.0.0 より前の Keycloak サーバーリリースではデフォルトで無効になっていることに注意してください。

ブルートフォース検出のためのログイン失敗に関する情報、および現在進行中の認証フローに関する情報は、Keycloak がシャットダウンされたときにクリアされる内部キャッシュにのみ保存されます。現在認証中、パスワードの変更中、またはパスワードのリセット中のユーザーは、Keycloak が起動して再度実行されたら、認証フローを再開する必要があります。

Keycloak サーバーのダウンロード

アップグレードの準備が完了したら、サーバーをダウンロードできます。

手順
  1. Keycloak ウェブサイトから keycloak-26.2.0.zip をダウンロードして解凍します。

    このファイルを解凍すると、keycloak-26.2.0 という名前のディレクトリが作成されます。

  2. このディレクトリを目的の場所に移動します。

  3. 以前のインストールから新しいインストールに 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>

このファイルをデータベースに適用する方法の詳細については、リレーショナルデータベースのドキュメントを参照してください。変更がファイルに書き込まれると、サーバーは終了します。

テーマの移行

カスタムテーマを作成した場合、それらのテーマを新しいサーバーに移行する必要があります。また、組み込みテーマへの変更は、カスタマイズした側面に応じて、カスタムテーマに反映する必要がある場合があります。

手順
  1. 古いサーバーの themes ディレクトリから新しいサーバーの themes ディレクトリにカスタムテーマをコピーします。

  2. テンプレート、メッセージ、およびスタイルを移行するには、次のセクションを使用します。

    • 移行の変更点 にリストされている更新されたテンプレートをカスタマイズした場合、ベーステーマのテンプレートと比較して、適用する必要がある変更を確認します。

    • メッセージをカスタマイズした場合、キーまたは値を変更するか、追加のメッセージを追加する必要がある場合があります。

    • スタイルをカスタマイズし、Keycloak テーマを拡張している場合は、スタイルの変更を確認します。ベーステーマを拡張している場合は、この手順をスキップできます。

テンプレートの移行

テンプレートをカスタマイズした場合、新しいバージョンを確認して、カスタマイズしたテンプレートを更新するかどうかを決定します。小さな変更を加えた場合は、更新されたテンプレートとカスタマイズしたテンプレートを比較できます。ただし、多くの変更を加えた場合は、新しいテンプレートとカスタマイズしたテンプレートを比較することを検討してください。この比較により、必要な変更点がわかります。

テンプレートを比較するには、diff ツールを使用できます。次のスクリーンショットは、ログインテーマの info.ftl テンプレートとカスタムテーマの例を比較したものです。

更新されたログインテーマテンプレートとカスタムログインテーマテンプレートの比較

Updated version of a Login theme template versus a custom Login theme template

この比較は、最初の変更 (Hello world!!) がカスタマイズであり、2 番目の変更 (if pageRedirectUri) がベーステーマへの変更であることを示しています。2 番目の変更をカスタムテンプレートにコピーすることで、カスタマイズされたテンプレートを正常に更新しました。

代替アプローチでは、次のスクリーンショットは、古いインストールからの info.ftl テンプレートと、新しいインストールからの更新された info.ftl テンプレートを比較したものです。

古いインストールからのログインテーマテンプレートと更新されたログインテーマテンプレートの比較

Login theme template from the old installation versus the updated Login theme template

この比較は、ベーステンプレートで何が変更されたかを示しています。その後、変更したテンプレートに同じ変更を手動で行うことができます。このアプローチはより複雑であるため、最初のアプローチが実現可能でない場合にのみこのアプローチを使用してください。

メッセージの移行

別の言語のサポートを追加した場合、上記のすべての変更を適用する必要があります。別の言語のサポートを追加していない場合は、何も変更する必要がない場合があります。テーマ内の影響を受けるメッセージを変更した場合にのみ、変更を行う必要があります。

手順
  1. 追加された値については、ベーステーマのメッセージの値を確認して、そのメッセージをカスタマイズする必要があるかどうかを判断します。

  2. 名前が変更されたキーについては、カスタムテーマでキーの名前を変更します。

  3. 変更された値については、ベーステーマの値を確認して、カスタムテーマに変更を加える必要があるかどうかを判断します。

スタイルの移行

組み込みテーマのスタイルに加えられた変更を反映するために、カスタムスタイルを更新する必要がある場合があります。古いサーバーインストールと新しいサーバーインストールの間で、スタイルシートの変更を比較するために 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 アダプターをアップグレードするには、次の手順を実行します。

手順
  1. 新しいアダプターアーカイブをダウンロードします。

  2. WILDFLY_HOME/modules/system/add-ons/keycloak/ ディレクトリを削除して、以前のアダプターモジュールを削除します。

  3. ダウンロードしたアーカイブを WILDFLY_HOME に解凍します。

JavaScript アダプターのアップグレード

JavaScript アダプターをアップグレードするには、NPM から最新バージョンをインストールします。

手順
  1. npm install keycloak-js@latest

Node.js アダプターのアップグレード

Node.js アダプターをアップグレードするには、 Node.js adapter ドキュメントを参照してください。