KeyCloak

Keycloak 24でカスタムOIDCクレームを作成・活用する方法

ⓘ本ページはプロモーションが含まれています

もっとスキルを活かしたいエンジニアへ

スポンサードリンク
働き方から選べる

無料で使えて良質な案件の情報収集ができるサービス

エンジニアの世界では、「いつでも動ける状態を作っておけ」とよく言われます。
技術やポートフォリオがあっても、自分に合う案件情報を日常的に見れていないと、いざ動こうと思った時に比較や判断が難しくなってしまいます。
普段から案件情報が集まる環境を作っておくと、良い案件が出た時にすぐ動きやすくなりますよ。
筆者自身も、メガベンチャー勤務時代に年収1,500万円を超えた経験があります。振り返ると、技術だけでなく「どんな案件や働き方があるか」を日頃から見ていたことが、キャリアの選択肢を広げるきっかけになりました。
このブログを読んでくれた方に感謝を込めて、実際に使っている情報収集サービスを紹介します。

フルリモート・週3日・高単価、どんな条件も妥協したくないなら

フリーランスボードに無料会員登録する

利用者10万人以上。業界最大規模45万件の案件。AIマッチ機能や無料の相場情報が人気。

年収800万円以上のキャリアアップ・ハイクラス正社員を視野に入れているなら

Beyond Careerに無料相談する

内定獲得率90%以上。紹介先企業とは役員クラスのコネクションがある安心と信頼できるエージェント。


スポンサードリンク

OIDC トークンとクレームの基本概念

OIDC では認可サーバが発行する ID トークンアクセストークン が JSON Web Token (JWT) の形で提供され、各トークンは「クレーム」の集合として扱われます。ここでは必須クレームとオプショナル(任意)クレームの違いを整理し、実装上注意すべきポイントを解説します。

必須クレームとオプションクレームの違い

OIDC 仕様はトークンに必ず含める必要がある 必須クレーム と、アプリケーション側の要件次第で付与できる オプショナルクレーム を明確に区別しています。

クレーム種別 主な項目例 役割・説明
必須クレーム iss, sub, aud, exp, iat トークンの署名検証や利用者識別に不可欠。すべてのトークンに自動的に含まれる。
オプションクレーム email, profile, address, カスタム属性(例:dept アプリが必要とする情報を任意で付与。スコープやマッパーで要求しなければトークンに現れない。

ポイント
必須クレームは常に存在しますが、カスタム属性は「オプショナル」として扱われ、Keycloak 側で プロトコルマッパーClient Scope に明示的に登録しなければトークンへ注入されません。

ID トークンとアクセストークンに含まれる標準クレーム

トークン種別 標準クレーム(代表) 主な利用シーン
ID トークン sub, name, email, preferred_username シングルサインオン (SSO) 時にユーザー情報を取得
アクセストークン scope, client_id, realm_access, resource_access API 呼び出し時の認可情報(どのロールが付与されているか)

まとめ
カスタムクレームは「オプショナル」領域に位置づけられ、Keycloak の UI または REST API で マッパー を作成し、必要に応じて Client Scope に紐付ける設計が必須です。


Keycloak 24.x でカスタムクレームを作成する手順

Keycloak 24 系は UI がモダン化され、左側メニューの「Protocol Mappers」からマッパー設定に直接アクセスできます。本節では UI 操作REST API の両方で「部署情報 (department) を dept クレームとしてトークンに付与する** 具体例を示します。

ユーザー属性を用いたマッピング – UI 操作

まずは Keycloak コンソール上で手動設定する流れです。以下の手順は 初回だけでも実行すれば、以降は UI が不要になる ことを意識してください。

  1. Realm → Users に移動し、対象ユーザー(例:john.doe)を開く。
  2. Attributes タブで新規属性 department = Sales を追加し、Save ボタンで確定する。

ヒント:属性名は任意ですが、後述のマッパー設定と一致させる必要があります。

  1. Realm → Clients → myclient → Mappers に遷移し、Create mapper をクリック。
  2. 「Mapper type」から User Attribute を選択し、以下の項目を入力する(テーブルは UI での見た目を再現)。
項目 設定例
Name department-claim
User Attribute department
Token Claim Name dept
Claim JSON Type String
Add to ID token
Add to Access token
Add to userinfo
  1. Save を押してマッパーを保存したら、Clients → myclient → Client Scopes に移動し、作成したスコープ(後述)を割り当てる。

導入文
UI で設定すると即座に結果が確認でき、属性名とクレーム名の違いも視覚的に把握できます。

REST API でプロトコルマッパーを自動登録

CI/CD パイプラインやインフラコード化(IaC)を行う場合は、REST API が便利です。以下は 具体的なプレースホルダー置換例 を含む完全スクリプトです。

  • REALMCLIENT_ID には 実際に使用する Realm 名(例:myrealm)と クライアント ID(例:myclient)を入力してください。
  • 上記スクリプトは jq がインストールされている環境前提です。出力が JSON 形式で整形され、作成結果の確認が容易になります。

導入文
REST API による自動化は設定ミスを防ぎ、同一構成を複数環境(開発・ステージング・本番)に再現できる点が最大の利点です。


ベストプラクティス:プロトコルマッパーとクライアントスコープの活用

カスタムクレームを 複数クライアントで共通利用 したい場合、個別にマッパーを配置すると管理負荷が急増します。ここでは Client Scope にマッパーを集約し、再利用性と保守性を高める手順をご紹介します。

マッパーとスコープの役割比較

項目 プロトコルマッパー Client Scope
目的 トークンに付与する単一クレームを定義 複数クライアントで共通利用できるクレーム集合・スコープ情報を管理
設定場所 各クライアント → Mappers Realm → Client Scopes
再利用性 低(クライアントごとに重複) 高(スコープ割り当てだけで全クライアントに反映)
運用負荷 設定変更時にすべてのクライアントを更新 スコープ側のみ更新すれば自動的に全体へ適用

ポイント
スコープは「名前空間」のような役割を果たし、マッパー集合を一括管理できるため、組織規模が大きくなるほど効果が顕著です。

共通 Client Scope の作成手順

  1. Realm → Client Scopes → Createcustom-claims スコープを作成(名前は任意)。
  2. 作成したスコープを開き、Mappers タブから先ほどの department-claimAdd Built-in または Create mapper で追加。
  3. Clients → myclient → Client Scopes に遷移し、custom-claims を次のいずれかに割り当てる。

  4. Default Client Scopes:全リクエストに自動付与(スコープ指定不要)。

  5. Optional Client Scopes:リクエスト時に scope=custom-claims が必要。

導入文
スコープ化したマッパーは、後から新しいクライアントを追加する際も「スコープだけ割り当てれば完了」というシンプルさが得られます。


Spring Boot 3 / Spring Security 6 と Quarkus 3.x でのカスタムクレーム取得例

Keycloak が発行した JWT に dept クレームが含まれることを前提に、代表的な Java フレームワークでの取得・活用パターンを示します。実装コードは Spring Security 6Quarkus smallrye‑jwt の両方で動作確認済みです。

Spring Security での JwtDecoder カスタマイズ

  • JwtDecoderclaimSetConverter でデフォルト値を設定すれば、クレームが欠落しているリクエストでも安全に処理できます。
  • JwtAuthenticationConverter にロジックを埋め込むことで、@PreAuthorize("hasRole('DEPT_SALES')") のような式で 部署別権限 を簡単に判定可能です。

導入文
Spring Security ではデコード・認可ロジックをコンポーネント化できるため、カスタムクレームの取り扱いが非常に柔軟です。

Quarkus smallrye‑jwt の設定と CDI ビーン例

application.properties

DeptClaimProducer.java

  • JsonWebToken のインジェクションにより、全クレームへシンプルにアクセスできます。
  • 上記 CDI ビーンは REST エンドポイントやサービス層で @Inject DeptClaimProducer dept; とすれば、そのまま dept.getDept() が呼び出せます。

導入文
Quarkus は smallrye‑jwt がデフォルトで有効化されており、JWT の検証とクレーム取得が数行のコードで完結します。


Docker Compose でローカル Keycloak 環境を構築しテスト・トラブルシューティング

実務での動作確認は Docker Compose が最も手軽です。本節では永続化設定やポート競合への配慮、さらに典型的なトラブルと対処法を含めた完全ガイドを示します。

docker‑compose.yml の推奨構成(永続化・ポート注意)

重要ポイント

項目 説明
KC_DB: dev-file Keycloak が内部的に使用する H2/SQLite 相当のファイルデータベースです。コンテナ再起動後もデータが残ります。
volumes.kc-data 永続化ボリュームを明示的に作成し、/opt/keycloak/data にマウントすることでユーザー・クライアント設定が失われません。
ポート競合対策 ホスト側で 8080 が既に占有されている場合は ports 行を "8181:8080" など別ポートへ変更してください。コンテナ内部のポートは変わりません。

導入文
永続化とポート競合への配慮だけで、開発環境の安定稼働が格段に楽になります。

起動手順

コンテナが正常に立ち上がったら、http://localhost:8080(または設定したポート)へアクセスし、管理者 admin/admin_password でログインしてください。realm-export.json が正しくマウントされていれば、ユーザー属性・マッパー・スコープが自動的にロードされています。

JWT の取得と内容確認(curl + jq)

  1. アクセストークン取得(Resource Owner Password Credentials)

  1. トークンのデコード(ローカルで確認)

出力例:

dept クレームが期待通り "Sales" と表示されていれば成功です。

よくある課題と対処法

症状 主な原因 推奨解決策
カスタムクレームがトークンに現れない マッパーを Client 配下に作成したが、対象スコープ未割当 Client Scope → custom-claimsDefault または Optional に設定し再取得
変更後も古いトークンが返る Keycloak が内部キャッシュ(token‑store)を保持している コンテナを docker compose restart keycloak、またはコンソール → Realm Settings → Tokens → Revoke Refresh Token を実行
起動時にポート競合エラー ホスト側で 8080 が他サービスに使用中 ports 行を "8181:8080" 等別ポートへ変更し、URL だけ置き換える
データがリセットされる ボリューム未指定または docker compose down -v 実行 volumes.kc-data を必ず定義し、削除時は down のみ実行(-v は付けない)

導入文
ここに挙げたチェックリストを踏むだけで、ほとんどの設定ミスや環境トラブルは即座に解決できます。


まとめ

項目 要点
OIDC の基礎 必須クレームは常に付与され、カスタム属性はオプショナルとしてマッパー/スコープで明示的に追加する必要がある。
Keycloak 24.x の設定 UI と REST API 両方で department → dept クレームを作成し、Client Scope にまとめて再利用性を確保。
ベストプラクティス プロトコルマッパーはスコープ単位で管理し、クライアント増減時の設定変更を最小化する。
Spring / Quarkus 側実装 JwtDecodersmallrye‑jwt にカスタムロジックを組み込むだけで、トークン内 dept クレームから権限情報やビジネスロジックに活用できる。
Docker Compose 永続化ボリュームとポート競合対策を施した docker‑compose.yml でローカル環境を即起動、curljwt.io でトークン内容を検証し、典型的な不具合はキャッシュやスコープ設定の見直しで解決できる。

これらの手順と注意点を実装・運用に取り込めば、Keycloak 24.x の OIDC カスタムクレーム を安全かつ効率的に導入でき、Spring Boot や Quarkus ベースのマイクロサービスでもシームレスに利用可能です。ぜひ本ガイドをプロジェクトのリファレンスとして活用し、認証基盤の柔軟性と拡張性を高めてください。

スポンサードリンク

もっとスキルを活かしたいエンジニアへ

スポンサードリンク
働き方から選べる

無料で使えて良質な案件の情報収集ができるサービス

エンジニアの世界では、「いつでも動ける状態を作っておけ」とよく言われます。
技術やポートフォリオがあっても、自分に合う案件情報を日常的に見れていないと、いざ動こうと思った時に比較や判断が難しくなってしまいます。
普段から案件情報が集まる環境を作っておくと、良い案件が出た時にすぐ動きやすくなりますよ。
筆者自身も、メガベンチャー勤務時代に年収1,500万円を超えた経験があります。振り返ると、技術だけでなく「どんな案件や働き方があるか」を日頃から見ていたことが、キャリアの選択肢を広げるきっかけになりました。
このブログを読んでくれた方に感謝を込めて、実際に使っている情報収集サービスを紹介します。

フルリモート・週3日・高単価、どんな条件も妥協したくないなら

フリーランスボードに無料会員登録する

利用者10万人以上。業界最大規模45万件の案件。AIマッチ機能や無料の相場情報が人気。

年収800万円以上のキャリアアップ・ハイクラス正社員を視野に入れているなら

Beyond Careerに無料相談する

内定獲得率90%以上。紹介先企業とは役員クラスのコネクションがある安心と信頼できるエージェント。


-KeyCloak