oracle-idcs-org-provisioning
OAuthログイン後、IDCSの情報を基に組織へのメンバーシップを自動で割り当て、初回管理者設定やテナントと組織のマッピングなど、ユーザー情報を効率的に管理・設定するSkill。
📜 元の英語説明(参考)
Use when mapping IDCS claims to org membership after OAuth login succeeds. Covers mapProfileToUser, session.create.before, session.create.after hooks, MERGE INTO upserts, tenant-org mapping, and first-admin bootstrap. Keywords: IDCS groups, org_members, provisioning, session hooks, tenant map, MERGE INTO.
🇯🇵 日本人クリエイター向け解説
OAuthログイン後、IDCSの情報を基に組織へのメンバーシップを自動で割り当て、初回管理者設定やテナントと組織のマッピングなど、ユーザー情報を効率的に管理・設定するSkill。
※ jpskill.com 編集部が日本のビジネス現場向けに補足した解説です。Skill本体の挙動とは独立した参考情報です。
下記のコマンドをコピーしてターミナル(Mac/Linux)または PowerShell(Windows)に貼り付けてください。 ダウンロード → 解凍 → 配置まで全自動。
mkdir -p ~/.claude/skills && cd ~/.claude/skills && curl -L -o oracle-idcs-org-provisioning.zip https://jpskill.com/download/9174.zip && unzip -o oracle-idcs-org-provisioning.zip && rm oracle-idcs-org-provisioning.zip
$d = "$env:USERPROFILE\.claude\skills"; ni -Force -ItemType Directory $d | Out-Null; iwr https://jpskill.com/download/9174.zip -OutFile "$d\oracle-idcs-org-provisioning.zip"; Expand-Archive "$d\oracle-idcs-org-provisioning.zip" -DestinationPath $d -Force; ri "$d\oracle-idcs-org-provisioning.zip"
完了後、Claude Code を再起動 → 普通に「動画プロンプト作って」のように話しかけるだけで自動発動します。
💾 手動でダウンロードしたい(コマンドが難しい人向け)
- 1. 下の青いボタンを押して
oracle-idcs-org-provisioning.zipをダウンロード - 2. ZIPファイルをダブルクリックで解凍 →
oracle-idcs-org-provisioningフォルダができる - 3. そのフォルダを
C:\Users\あなたの名前\.claude\skills\(Win)または~/.claude/skills/(Mac)へ移動 - 4. Claude Code を再起動
⚠️ ダウンロード・利用は自己責任でお願いします。当サイトは内容・動作・安全性について責任を負いません。
🎯 このSkillでできること
下記の説明文を読むと、このSkillがあなたに何をしてくれるかが分かります。Claudeにこの分野の依頼をすると、自動で発動します。
📦 インストール方法 (3ステップ)
- 1. 上の「ダウンロード」ボタンを押して .skill ファイルを取得
- 2. ファイル名の拡張子を .skill から .zip に変えて展開(macは自動展開可)
- 3. 展開してできたフォルダを、ホームフォルダの
.claude/skills/に置く- · macOS / Linux:
~/.claude/skills/ - · Windows:
%USERPROFILE%\.claude\skills\
- · macOS / Linux:
Claude Code を再起動すれば完了。「このSkillを使って…」と話しかけなくても、関連する依頼で自動的に呼び出されます。
詳しい使い方ガイドを見る →- 最終更新
- 2026-05-18
- 取得日時
- 2026-05-18
- 同梱ファイル
- 1
📖 Skill本文(日本語訳)
※ 原文(英語/中国語)を Gemini で日本語化したものです。Claude 自身は原文を読みます。誤訳がある場合は原文をご確認ください。
Oracle IDCS Org プロビジョニング
ログインが成功したが、テナント、ロール、または組織のメンバーシップが Oracle でまだ有効になっていない場合に使用します。
次の場合はロードしないでください
- 問題が Fastify ヘッダーブリッジングまたは Cookie/セッション転送である場合
- 問題が基本的な OIDC の設定、コールバック URL、または信頼できるオリジンである場合
- タスクが既存のコードベース全体で IDCS の概念の名前を変更することである場合
3 段階のフロー
- OAuth プロファイルマッピング中に IDCS クレームをキャプチャします (
mapProfileToUser) - 明示的な許可ルールが存在する場合、
session.create.beforeでセッションをゲートします session.create.afterで組織を解決し、org_membersを upsert します
絶対に
- アクセスゲートとロールマッピングを組み合わせないでください。これらは別々の失敗モードを持つ別々の決定です
org_membersに対してSELECTしてからINSERTしないでください。アトミックなMERGE INTOを使用しないと、同時ログインがメンバーシップを破損させますbeforeでキャッシュされたクレームを消費し、afterでまだ利用可能であると期待しないでください。stash/peek/consume パターンを使用してください- より新しいフォールバックで既存のメンバーシップの優先順位をバイパスしないでください。再ログインの不安定さが続きます
groupsクレームがないことをプロビジョニングのバグだと決めつけないでください。最初にスコープ構成と IDCS アプリを確認してください
エキスパート向けの意思決定ツリー
アクセスゲート vs. ロールマッピング
これらは異なる質問に答えます。
- アクセスゲート (
beforeフック): このユーザーはそもそも入室できますか? DB で構成された許可グループによって制御されます。明示的な許可グループが存在する場合のみクローズドで失敗し、それ以外の場合はオープンで失敗します。 - ロールマッピング (
afterフック): どのロールを取得しますか? group→role マッピングと環境のデフォルトによって制御されます。
これらを混在させると、誤ったロックアウトが発生します。ユーザーはアクセスゲートを通過しますが、ゲートロジックがロール解決をショートカットしたため、間違ったロールを取得します。
組織解決の優先順位
常にこの順序を使用してください。「簡略化」のためにレベルをスキップしないでください。
org_membersの既存のメンバーシップ- テナント名 → 組織マップ (DB で構成)
- DB で構成されたデフォルト組織
- 環境のデフォルト組織
この順序をデプロイメント中に変更すると、以前に優先順位の高いルールで割り当てられたユーザーの再ログインが中断されます。
最初の管理者ブートストラップ
新規インストールには、管理者グループの構成がありません。組織にまだ管理者がいない場合は、最初にプロビジョニングされたユーザーを一度だけ admin に昇格させます。このゲートがないと、システムはブートストラップできません。誰も管理者権限を持っていないため、誰も許可グループを構成できません。
フック境界を越えたクレームキャッシュ
フックは、個別のリクエストライフサイクルで実行されます。mapProfileToUser からのクレームセットは、明示的な受け渡しなしに session.create.after で利用できません。
- プロファイルマッピングで
stash(sub, claims) beforeでpeek(sub)(クリアせずに読み取り)afterでconsume(sub)(読み取りとクリア)
sub をキーとする短寿命のインメモリキャッシュを使用するのが標準的なパターンです。TTL は約 30 秒で十分です。
意思決定ポイントごとの失敗モード
| 状況 | 決定 |
|---|---|
groups クレームがない |
プロビジョニングコードに触れる前に、スコープと IDCS アプリの構成を確認してください |
| 明示的な DB 許可グループがない | オープンで失敗します — ロックアウトはありません |
| DB のルックアップまたは書き込みが失敗する | ログインに対してオープンで失敗し、ログに記録します — ロックアウトは決してデフォルトの結果であってはなりません |
| 組織にまだ管理者がいない | 最初にプロビジョニングされたユーザーを一度だけ昇格させます |
スクリプト
# グループ → ロールマッピングのプレビュー
node scripts/preview-group-role-mapping.js "PortalAdmins,Developers"
# 組織解決のプレビュー
node scripts/verify-org-resolution.js --tenant sandbox --map "sandbox:org-123,prod:org-999" --default-org org-000
引数
$ARGUMENTS: オプションのプロビジョニングフォーカスtenant-map— tenant→org 解決に焦点を当てるfirst-admin— ブートストラップロジックに焦点を当てる- (空) — 完全な IDCS クレーム → 組織メンバーシップフローを評価する
📜 原文 SKILL.md(Claudeが読む英語/中国語)を展開
Oracle IDCS Org Provisioning
Use when login succeeds but tenant, role, or org membership still has to become real in Oracle.
Do NOT load when
- problem is Fastify header bridging or cookie/session forwarding
- problem is base OIDC setup, callback URLs, or trusted origins
- task is renaming IDCS concepts across an existing codebase
Three-stage flow
- Capture IDCS claims during OAuth profile mapping (
mapProfileToUser) - Gate session in
session.create.beforewhen explicit allow-rules exist - Resolve org and upsert
org_membersinsession.create.after
NEVER
- Never combine access gating with role mapping — they are separate decisions with separate failure modes
- Never
SELECTthenINSERTintoorg_members— use atomicMERGE INTOor concurrent logins corrupt membership - Never consume cached claims in
beforeand expect them still available inafter— use stash/peek/consume pattern - Never bypass existing membership precedence with a newer fallback — re-login instability follows
- Never assume missing
groupsclaim is a provisioning bug — check scope config and IDCS app first
Expert decision trees
Access gate vs. role mapping
These answer different questions:
- Access gate (
beforehook): can this user enter at all? Controlled by DB-configured allow-groups. Fail closed only when explicit allow-groups exist; fail open otherwise. - Role mapping (
afterhook): which role do they get? Controlled by group→role mapping and env defaults.
Mixing them produces false lockouts: a user passes the access gate but gets the wrong role because the gating logic short-circuited role resolution.
Org resolution precedence
Always use this order — never skip a level for "simplicity":
- Existing membership in
org_members - Tenant-name → org map (DB-configured)
- DB-configured default org
- Env default org
Changing this order mid-deployment breaks re-login for users who were previously assigned via a higher-precedence rule.
First-admin bootstrap
Fresh installs have zero admin-group config. If an org has no admin yet, promote the first provisioned user to admin once. Without this gate, the system is unbootstrappable — no one can configure allow-groups because no one has admin rights.
Claims cache across hook boundary
Hooks run in separate request lifecycles. The claim set from mapProfileToUser is not available in session.create.after without explicit passing:
stash(sub, claims)in profile mappingpeek(sub)inbefore(read without clearing)consume(sub)inafter(read and clear)
Using a short-lived in-memory cache keyed by sub is the standard pattern. TTL of ~30s is sufficient.
Failure modes by decision point
| Situation | Decision |
|---|---|
No groups claim |
Check scope and IDCS app config before touching provisioning code |
| No explicit DB allow-groups | Fail open — no lockout |
| DB lookup or write fails | Fail open for login, log it — lockout must never be the default outcome |
| Org has no admin yet | Promote first provisioned user once |
Scripts
# Preview group → role mapping
node scripts/preview-group-role-mapping.js "PortalAdmins,Developers"
# Preview org resolution
node scripts/verify-org-resolution.js --tenant sandbox --map "sandbox:org-123,prod:org-999" --default-org org-000
Arguments
$ARGUMENTS: Optional provisioning focustenant-map— focus on tenant→org resolutionfirst-admin— focus on bootstrap logic- (empty) — evaluate the full IDCS claim → org membership flow