🖇️

Keyclaok の Identity Broker はアカウントのリンクをどのようなデータとして保持しているか

2023/05/24に公開

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 におけるアカウントのリンク
First Login Flow におけるアカウントのリンク

Keyclaok データベースのデータはどうなった?

アカウントをリンクすることで、 BROKER_LINK テーブルにレコードが1件追加されました。
このテーブルでは、 OP 側から受け取ったユーザーを識別する情報を BROKER_USER_ID と BROKER_USERNAME という二つの列に保持しているようです。
BROKER_USER_ID には、 OP が発行した ID トークンの sub クレームの値がセットされているものと考えられます。

BROKER_LINK テーブルのデータ
BROKER_LINK テーブルのデータ

まとめ

Keycloak の Identity Broker において、アカウントのリンクが BROKER_LINK テーブルのデータとして管理されていることを確認しました。また、カスタムユーザーストレージで管理されているアカウントに対しても、アカウントリンクが機能することを確認しました。

Discussion