ID-JAG、エージェントとリソース・サーバーの間のOAuth Glue (2026/11/12)
ID-JAG、エージェントとリソース・サーバーの間のOAuth Glue (2026/11/12)
https://www.ateam-oracle.com/id-jag-the-oauth-glue
投稿者:Kiran Thakkar | Master Principal Cloud Architect
OCI Identity Domains ID-JAGトークンがクロスドメインアクセスにおいて重要な理由
OCI上または他の場所で実行される最新のワークロードは、単一のアプリケーション、単一のAPI、あるいは単一のID境界だけで構成されていることはほとんどありません。従業員はOCI Identity Domainsで一度認証した後、別の信頼ドメインによって保護されたMCPサーバー、ツール、またはAPIへのアクセスを必要とするOracleホスト型アプリケーション、自動化ツール、またはAIエージェントを使用する場合があります。

課題は、ユーザーに同意を求めるために繰り返しリダイレクトしたり、無関係なリソースサーバーに生のIDトークンを渡したり、広く信頼され、長期間有効な認証情報を作成したりすることなく、そのアクセスを可能にすることである。
OCI Identity Domains は、ID-JAG (Identity Assertion JWT Authorization Grant) を使用してこのパターンをサポートしています。ID-JAG は、信頼ドメイン間で認可アサーションを伝達する、有効期限の短い署名付き JWT です。これは OAuth アクセス トークンではなく、API を直接呼び出すために使用してはなりません。代わりに、ターゲットの Identity Domain が ID-JAG を、ターゲットのリソース サーバーが受け入れるアクセス トークンと交換します。Oracleのドキュメントを参照してください。
ID-JAGの価値
ID-JAGは、独立性を保つべき3つの懸念事項を区別している。
- 認証:ユーザーは、ソースOCIアイデンティティドメイン、またはソースドメインが発行するIDトークンを生成するエンタープライズフェデレーションを通じてサインインします。
- ドメイン間認証ハンドオフ:送信元ドメインはポリシーを評価し、承認されたIDと認証コンテキストのみを含むID-JAGを発行します。
- リソース認証:リソースサーバーを管理するターゲットドメインは、ID-JAGを検証し、独自のOAuthアクセストークンを独自に発行します。
このモデルでは、管理者は交換の両端で明確な制御を行うことができます。送信側は、どのランタイムクライアントがID-JAGを発行できるか、また、どのスコープとリソースを保持できるかを制御します。送信側は、アクセストークンを発行する前に、どの発行者、ユーザー、送信側クライアント、および送信側クライアントを受け入れるかを制御します。
この結果は、Oracleアプリケーション間のアクセス、自動化、およびエージェントのシナリオにおいて、ブラウザのリダイレクトや同意プロンプトを繰り返すのではなく、企業が事前にポリシーを決定しておく必要がある場合に役立ちます。
これにはいくつかの実用的な利点があります。
- 集中型ポリシー:管理者は、実行前にどのOAuthクライアント、スコープ、リソース、および信頼関係が許可されるかを管理します。
- 最小権限の原則:交換要求では、包括的なアクセス権を付与するのではなく、意図する範囲とリソースを指定します。
- 生のIDトークンの再利用は禁止:ソースドメインのIDトークンは識別情報として保持され、専用に作成された短命のアサーションと交換されます。
- 独立したターゲット認証:ターゲットドメインは、すべてのアサーションを自動的に信頼するわけではありません。独自のアクセストークンを発行する前に、設定された受信信頼関係に基づいてID-JAGを検証します。
- 自動化のサポート強化:Oracleがホストするアプリケーションまたはエージェントは、ドメイン間操作のたびにユーザーに確認を求めるのではなく、事前に構成されたポリシーを通じて委任アクセスを取得できます。
つまり、ID-JAGはIDドメイン間の引き渡し手段です。アプリケーションが保護されたAPI(リソースサーバー)に提示するのは、ID-JAGではなく、結果として得られるOAuthアクセストークンです。
ID-JAGのリクエストフロー

前提条件
OCI Identity DomainsがエンタープライズIDP(ソースIDドメイン)とリソース認証サーバー(ターゲットIDドメイン)の両方であると仮定して、以下の手順に従って信頼関係を設定します。
- ソースおよびターゲットのOCI Identity DomainsでID-JAGのサポートを有効にします。
- IDトークンとID-JAGの交換のために、ソースドメインに機密性の高いOAuthクライアントを作成します。
- ID-JAGの引き換え用に、対象ドメイン内に 別途機密性の高いOAuthクライアントを作成します。
- 送信元ドメインで、アクティブなアウトバウンドID伝播信頼(IPT)を設定します。
- 対象ドメインでアクティブな受信IPTを設定します。
- ソースIDトークンには空でない`sub`クレームが含まれており、ソースOCIアイデンティティドメインによって発行されていることを確認してください。生のアップストリームIDトークン、任意のJWT、またはアクセストークンは代替として認められません。
ランタイムクライアントの認証情報は、シークレットマネージャに保管してください。信頼関係を管理するクライアントは、権限の低いランタイム交換クライアントとは分離する必要があります。
ソースアウトバウンドID伝播信頼を構成する
ソースID伝播信頼は、ソースドメインが入力IDトークンを検証し、ソースランタイムクライアントを認証した後、ID-JAGを作成する前に評価されます。
その役割は、 「このソースクライアントは、このユーザー、スコープ、およびターゲットリソースに対してID-JAGを取得できるか?」という問いに答えることです。
重要な発信設定には以下が含まれます。
以下に、送信側ID伝播信頼リクエストボディの例を示します。OCI Identity Domain SCIM APIとドメイン固有の管理者権限を使用して作成してください。
{
"schemas": [
"urn:ietf:params:scim:schemas:oracle:idcs:IdentityPropagationTrust"
],
"name": "Source-to-target ID-JAG issuance",
"description": "Allows the source runtime client to request a constrained ID-JAG",
"type": "JWT",
"issuer": "https://source-domain.identity.oraclecloud.com/",
"active": true,
"subjectClaimName": "sub",
"subjectMappingAttribute": "userName",
"idJagEnabled": true,
"idJagClients": [
{
"idJagOauthClientIds": ["SOURCE_RUNTIME_CLIENT_ID"],
"outboundIdJagPermittedScopes": [
"https://resource.example.oraclecloud.com/read"
],
"outboundIdJagPermittedResources": [
"https://resource.example.oraclecloud.com/"
]
}
]
}送信元ドメインは、要求された値と信頼許可リストを照合します。信頼は、送信元ドメインから外部に送信できるものを制限しますが、ターゲットがアクセストークンを発行するかどうかを決定するものではありません。
ソース ID トークンを ID-JAG と交換する
ユーザーが認証を完了したら、ソースドメインが発行したIDトークンを使用して、RFC 8693リクエストをソースIDドメインのトークンエンドポイントに送信します。エージェントまたはユーザーがソースIDドメインからIDトークンを取得する方法については、このブログの範囲外です。
curl --request POST "$SOURCE_IDENTITY_DOMAIN/oauth2/v1/token" \
--header "Authorization: BASIC $SOURCE_CLIENT_ID:$SOURCE_CLIENT_SECRET" \
--header "Content-Type: application/x-www-form-urlencoded" \
--data-urlencode "grant_type=urn:ietf:params:oauth:grant-type:token-exchange" \
--data-urlencode "requested_token_type=urn:ietf:params:oauth:token-type:id-jag" \
--data-urlencode "subject_token=$SOURCE_ID_TOKEN" \
--data-urlencode "subject_token_type=urn:ietf:params:oauth:token-type:id_token" \
--data-urlencode "scope=https://resource.example.oraclecloud.com/read" \
--data-urlencode "resource=https://resource.example.oraclecloud.com/"ソースドメインは、クライアント、IDトークン、一致する送信IPT、および要求されたスコープとリソースを検証します。正常な応答では、`access_token`応答メンバーにID-JAGが返されます。この値は、リソースサーバーのベアラートークンではなく、ID-JAG中間グラントとして扱ってください。
ターゲットの受信ID伝播信頼を構成する
ターゲットとなるID伝播の信頼性は、アプリケーションがID-JAGをターゲットトークンエンドポイントに提示する際に評価されます。
その役割は、以下の質問に答えることです。この情報源が発行した主張を信頼できるか、その主題をローカルで解決できるか、そしてこのターゲットクライアントはそれを償還できるか?
重要な受信設定には以下が含まれます。
ソースクライアントとターゲット交換クライアントは、それぞれ異なる役割を持つ別々のIDです。これらは同じ`idJagClients`エントリ内でまとめて評価されます。
{
"schemas": [
"urn:ietf:params:scim:schemas:oracle:idcs:IdentityPropagationTrust"
],
"name": "Accept source-domain ID-JAG",
"description": "Allows the target runtime client to redeem approved source ID-JAGs",
"type": "JWT",
"issuer": "https://source-domain.identity.oraclecloud.com/",
"active": true,
"subjectClaimName": "sub",
"subjectMappingAttribute": "userName",
"publicCertificate": "BASE64_X509_SOURCE_SIGNING_CERTIFICATE",
"idJagEnabled": true,
"idJagClients": [
{
"idJagOauthClientIds": ["TARGET_RUNTIME_CLIENT_ID"],
"inboundIdJagCrossDomainClientId": ["SOURCE_RUNTIME_CLIENT_ID"]
}
]
}あるいは、ソース署名キーの検出用にサポートされている `publicKeyEndpoint` を設定してください。この方法を使用する場合、ID-JAG ヘッダーには、`kid`、`x5t`、または `x5t#S256` などの検証キーを指定する必要があります。
ID-JAGをターゲットOAuthアクセストークンと交換します。
アプリケーションは、ターゲットとなるアイデンティティドメイントークンエンドポイントを呼び出します。ターゲットは、ID-JAG署名と有効期限を検証し、発行者からの受信信頼を選択し、サブジェクトをマッピングし、送信元からターゲットへのクライアントバインディングを検証し、認可ポリシーを適用します。
curl --request POST "$TARGET_IDENTITY_DOMAIN/oauth2/v1/token" \
--header "Authorization: Basic $TARGET_CLIENT_ID:$TARGET_CLIENT_SECRET" \
--header "Content-Type: application/x-www-form-urlencoded" \
--data-urlencode "grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer" \
--data-urlencode "assertion=$ID_JAG" \
--data-urlencode "scope=https://resource.example.oraclecloud.com/read"結果として得られる`access_token`は、ターゲットとなるIDドメインによって発行されたOAuthベアラートークンです。このフローにおいて、リソースサーバーに送信されるべきトークンはこれだけです。
Authorization: Bearer <target-domain-access-token>ターゲットとなるリソースサーバーは、独自の認証モデルと付与されたスコープに基づいてこのアクセストークンを評価します。ID-JAG自体は、API認証情報ではありません。
この区別は極めて重要である。
- IDトークンは、認証されたユーザーをソース側に識別するために使用されます。
- ID -JAGには、有効期限の短い、署名付きのクロスドメイン認証アサーションが含まれています。
- OAuthアクセストークンは、リソースサーバーの認証サーバーによって発行され、そのリソースサーバーへの呼び出しを認証します。
ターゲットドメインは引き続き制御権を保持します。ID-JAGを償還するかどうか、また発行するアクセストークンとスコープを独自に決定します。OracleのID-JAG概要およびターゲットドメイン償還ガイダンスでは、この分離について説明しています。
運用上の指針
エンタープライズIDPとリソースサーバーの認証サーバーが同じ場合、ID-JAGトークンを使用する代わりに、2レッグまたは3レッグのOAuthを使用できます。
- トークンエンドポイントの両方でHTTPS接続を必須とする。
- 実行時におけるやり取りには、機密性の高いOAuthクライアントを使用してください。
- クライアントの秘密情報とトークンは、承認された秘密情報取扱システムにのみ保存してください。
- 末尾のスラッシュの動作を含め、発行者文字列を正確に設定します。
- ソーススコープ/リソースの許可リストは狭く保つ。
- ターゲット対象マッピングが、アクティブなターゲットドメインユーザー1人に解決されることを確認してください。
- 承認済みのソースクライアントとターゲットの償還クライアントを、同じ受信エントリ「idJagClients」にバインドします。
- IDトークン、ID-JAG、クライアントシークレット、認証コード、アクセストークンをログに記録しないでください。
- リソースサーバーを呼び出す際は、ターゲットサーバーが発行したOAuthベアラーアクセストークンのみを使用してください。
OCI Identity Domains ID-JAGのサポートにより、Oracle環境は信頼境界を越えた統制された委任アクセスを実用的な方法でサポートできるようになります。これにより、認証処理が繰り返し行われるユーザー操作から明示的なIdentity Domainポリシーへと移行し、同時にターゲットドメインにおける独立した制御が維持されます。
まとめ
OCI Identity DomainsのID-JAGサポートは、ドメイン間の統制されたハンドオフを提供します。送信元ドメインは発行するアサーションを制御し、送信先ドメインはそのアサーションが保護されたOracleリソースへのアクセスとなるかどうかを制御します。この2段階のやり取りにより、信頼境界が維持され、委任された権限が制限され、リソース側が最終的な承認決定権を持つことになります。
コメント
コメントを投稿