Keyclaok の Identity Broker はアカウントのリンクをどのようなデータとして保持しているか
Keyclaok の Identity Broker で外部の IdP のアカウントと Keycloak が管理するローカルアカウントをリンクしたときに、その情報を Keycloak がリンクをどのようなデータとして管理しているか確認しました。
検証環境の構成
High-level Design
今回は Keyclaok version 21.1.1 で検証しました。以下の図のとおり、 Keycloak の単一インスタンス内に二つのレルムを作成し、 OIDC でフェデレーションを構成しました。今回は OP 側も Keycloak にしましたが、もちろん Keyclaok でなくても構いません。
検証環境の構成
二つのアカウントのリンク
OP 側の external-idp レルムでは、 tbrady というユーザーを Keycloak の内部ユーザーストレージに 作成しています。
RP 側の demo レルムにも tbrady ユーザーが存在していますが、こちらは Keycloak の内部ユーザーストレージにではなく、 readonly-property-file と名付けたカスタムユーザーストレージにユーザー名とパスワードの情報を保持しています。今回は RP 側がカスタムユーザーストレージの場合にどのような挙動になるのか確認したかったため、あえてこのような構成にしています。カスタムユーザーストレージには Keyclaok のクイックスタート user-storage-simple をそのまま使っています。
この状態で、二つの tbrady ユーザーをリンクさせました。Keycloak のデフォルトの認証フロー (First Login Flow) では、 OP 側の ID で RP 側にログインした際に RP 側に同じ名前のユーザーが見つかるとアカウントのリンクを促されるので、これを利用してアカウントをリンクさせました。
First Login Flow におけるアカウントのリンク
Keyclaok データベースのデータはどうなった?
アカウントをリンクすることで、 BROKER_LINK テーブルにレコードが1件追加されました。
このテーブルでは、 OP 側から受け取ったユーザーを識別する情報を BROKER_USER_ID と BROKER_USERNAME という二つの列に保持しているようです。
BROKER_USER_ID には、 OP が発行した ID トークンの sub クレームの値がセットされているものと考えられます。
BROKER_LINK テーブルのデータ
まとめ
Keycloak の Identity Broker において、アカウントのリンクが BROKER_LINK テーブルのデータとして管理されていることを確認しました。また、カスタムユーザーストレージで管理されているアカウントに対しても、アカウントリンクが機能することを確認しました。
Discussion