2025年12月18日木曜日

Role based JWT profileで保護したORDS REST APIにアクセスする - Oracle IAM編

更新:2026年2月27日

ORDS RESTサービスとして作成したリモートMCPサーバーをOracle IAMで認証します。

以下の記事にそって構築した環境を使用します。

DNSでホスト名の解決ができ、インターネットからアクセス可能なOracle APEXとORDSの実行環境を作成します。Autonomous AI Databaseを使用する場合は、nginxをリバース・プロキシとして実行する環境だけが必要です。
カスタムのリモートMCPサーバーをORDSのRESTサービスとして実装します。上記で作成したAPEXの環境に、APEXのワークスペースを作成します。
上記で作成したカスタムのリモートMCPサーバーをOAuth2で認証するために、以下の手順にそってnginxのリバース・プロキシに設定を追加します。
動作確認にMCP Inspector、Claude Desktop、OpenAI ChatGPTを使用します。

以下の記事にそって、あらかじめOracle IAMの統合アプリにカスタム・クレームを追加しておきます。

Oracle IAMの統合アプリにカスタム・クレームを追加しRole based JWT profileによる保護を確認する
https://apexugj.blogspot.com/2025/12/protecting-ords-by-role-based-jwt-profile-with-oracle-iam.html

本記事では、以下の作業が完了していることを前提とします。
  • 発行者(issuer)をデフォルトのhttps://identity.oraclecloud.com/としています。
  • 署名証明書へのアクセスクライアント・アクセスの構成有効にしています。
  • カスタム・クレームiam_groupsを作成しています。


Oracle IAMの設定



Defaultドメインのユーザー管理を開き、ORDSでロールとして扱うグループを作成します。


作成するグループの名前ORDSUsers説明は「ORDS REST APIへのアクセスを許可」と記述します。

グループに含めるユーザーチェックし、作成を実行します。


グループORDSUsersが作成されます。


ユーザータブを開き、グループ作成時にチェックしたユーザーが含まれていることを確認します。


グループの作成は以上で完了です。

Defaultドメインの統合アプリケーションを開き、 アプリケーションの追加をクリックします。


モバイル・アプリケーションを選択し、ワークフローの起動をクリックします。


追加するモバイル・アプリケーションの名前ORDS MCPとします。画面下部にある、認証と認可権限付与を認可として実施オンにします。このアプリケーションに割り当てられたユーザーおよびグループのみがサインインできるようになります。

送信をクリックします。


アプリケーションORDS MCPが作成されます。


OAuth構成タブを開きます。

一般情報クライアントIDは、MCP InspectorのOAuth 2.0 FlowClient IDに設定する値になります。接続時に必要になるため、メモしておきます。

OAuth構成の編集をクリックします。


認可許可される権限付与タイプに含まれる、リフレッシュ・トークン認可コードチェックします。

MCP InspectorのリダイレクトURLはHTTPなので、HTTPS以外のURLを許可オンにします。

リダイレクトURLとして、以下の3つを設定します。

http://localhost:6274/oauth/callback
https://chatgpt.com/connector_platform_oauth_redirect
https://claude.ai/api/mcp/auth_callback

以上を設定し、送信します。


アプリケーションをアクティブ化します。

アクション・メニューのアクティブ化を実行します。


アプリケーションがアクティブ化されたら、ユーザータブを開き、このアプリケーションにサインインできるユーザーの割当てを実施します。


アプリケーションに割り当てるユーザーを選択し、割当てをクリックします。


以上で、Oracle IAMにモバイル・アプリケーションORDS MCPが作成できました。



ORDSおよびnginxの設定



ORDS REST APIの保護とアクセスに必要な設定を集めます。

発行者はデフォルト値としているので、ORDS_SECURITY.CREATE_JWT_PROFILEを呼び出す際に、引数p_issuerに与える値はhttps://identity.oraclecloud.com/になります。

Defaultドメインの詳細に記載されているドメインURLが、ORDS_SECURITY.CREATE_JWT_PROFILEを呼び出す際に、引数p_audienceに与える値になります。また、この値はoauth-protected-resourceresource属性に設定する値になります。


以下のURLで取得できる内容を、nginxが返す/.well-known/openid-configurationとして配置します。

https://ドメインURL/.well-known/openid-configuration

上記のURLにブラウザよりアクセスし、属性jwks_uriの値を取得します。この値は、ORDS_SECURITY.CREATE_JWT_PROFILEを呼び出す際に、引数p_jwk_urlに与える値になります。


oauth-protected-resourceauthorization_serversとして設定する値は、ドメインURLになります。

ORDS REST APIの保護とアクセスに必要な設定は以上になります。

ロール・ベースJWTプロファイルを設定します。

ORDS_SECURITY.CREATE_JWT_PROFILEを実行します。それぞれの引数には、今まで集めた設定値を割り当てます。引数p_role_claim_nameには、以前の記事で作成している/iam_groupsを指定します。
begin
    ords_security.delete_jwt_profile;
    ords_security.create_jwt_profile(
        p_issuer => 'https://identity.oraclecloud.com/'
        ,p_audience => 'ドメインURL'
        ,p_jwk_url => 'ドメインURL/admin/v1/SigningCert/jwk'
        ,p_role_claim_name => '/iam_groups'
    );
end;
/

ビューUSER_ORDS_JWT_PROFILEを検索し、設定した内容を確認します。

select issuer,audience,jwk_url,role_claim_name from user_ords_jwt_profile


以下のスクリプトを実行し、Oracle REST Data Servicesに権限oracle.example.mcpを作成(すでに存在する場合は再定義)します。ロールとしてORDSUsersを作成し、RESTモジュールsampleserverを保護します。
declare
    l_roles    owa.vc_arr;
    l_modules  owa.vc_arr;
    l_patterns owa.vc_arr;
begin
    ords.create_role(
        p_role_name => 'ORDSUsers'
    );
    l_modules(1) := 'sampleserver';
    l_roles(1)   := 'ORDSUsers';
    ords.define_privilege(
        p_privilege_name => 'oracle.example.mcp',
        p_label          => 'Priviledge for MCP',
        p_roles          => l_roles,
        p_modules        => l_modules,
        p_patterns       => l_patterns    -- no assignment
    );
end;
/

nginxを実行しているインスタンスに接続し、/.well-known/以下を設定します。

rootユーザーで作業します。

sudo -s

[opc@apex ~]$ sudo -s

[root@apex opc]# 


nginxのドキュメント・ルートに移動します。

cd /usr/share/nginx/html

[root@apex opc]# cd /usr/share/nginx/html

[root@apex html]# 


ディレクトリ.well-knownを作成します。

mkdir .well-known

[root@apex html]# mkdir .well-known

[root@apex html]# 


以下を記述したファイルを、.well-known/oauth-protected-resourceとして作成します。resourceドメインURLauthorization_serversにもドメインURLを設定します。
{
  "resource": "ドメインURL",
  "authorization_servers": {
    "ドメインURL"
  }
}
authorization_serversの設定で、JSON配列ではなく{}で囲んでJSONオブジェクトにしています。構文的に間違っていますが、authorization_serversが認識できないと、認可サーバーの代わりにリソース・サーバー上の/.well-known/oauth-authorization-serverにアクセスするため、わざとこうしています。

メタデータをダウンロードし、.well-known以下に配置します。

curl -L -o .well-known/oauth-authorization-server ドメインURL/.well-known/openid-configuration

[root@ordsmcp html]# curl -L -o .well-known/oauth-authorization-server https://idcs-*****************identity.oraclecloud.com/.well-known/openid-configuration

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current

                                 Dload  Upload   Total   Spent    Left  Speed

100  3217  100  3217    0     0   161k      0 --:--:-- --:--:-- --:--:--  165k

[root@ordsmcp html]# 


以上で全体の設定が完了しました。


クライアントからの接続確認



MCP Inspectorを起動します。

npx @modelcontextprotocol/inspector

Transport TypeStreamable HTTPを選択し、URLにORDSのRESTモジュールとして実装されているサンプルのMCPサーバーのURLを設定します。

https://ホスト名/ords/apexdev/sampleserver/mcp

OAuth 2.0 FlowClient IDに、Oracle IAMに作成した統合アプリケーションORDS MCPクライアントIDを設定します。

2026年2月27日追記 - Scopeの指定が必須になったようです。デフォルトで含まれるはずのopenidScopeに指定します。

Connectをクリックし、認証プロセスを開始します。


Oracle IAMのサインインの画面に遷移します。


ユーザー認証に成功しました。


以上でRole based JWT profileで保護したORDS REST APIを、MCP Inspectorでアクセスできました。

以下より、ブラウザ版のChatGPTで、このMCPサーバーをアプリとして作成してみます。

ChatGPTはMCP Inspectorとは異なり、oauth-protected-resourceのauthorization_serversを正しく認識するため、JSONオブジェクトではなくJSON配列で設定します。
{
  "resource": "ドメインURL",
  "authorization_servers": [
    "ドメインURL"
  ]
}
ChatGPTのプランに依存すると思いますが(Plusプランで確認しています)ブラウザ版ChatGPTを開発者モードにすると、設定アプリ高度な設定が表示されます。

アプリを作成するをクリックします。


新しいアプリの名前My Oracle Appとします。説明として「Oracleデータベースに接続しSELECT文を実行します」を記述します。

MCPサーバーのURLは、MCP Inspectorに設定したURLと同じです。

https://ホスト名/ords/apexdev/sampleserver/mcp

認証OAuthを選択し、(DCR - 動的クライアント登録は構成していないため)OAuthクライアントIDに、Oracle IAMに作成したアプリケーションORDS MCPのクライアントIDを設定します。

理解したうえで、続行しますチェックし、作成するをクリックします。


Oracle IAMの認証プロセスが開始します。サインイン手順はMCP Inspectorと同じです。

サインインが完了すると、作成したアプリMy Oracle Appが接続します。

アクションとしてツールのget_schemaやrun_sqlが見えているので、OAuthによる認証は成功しています。



ChatGPTで新しいチャットを開始し、作成したアプリMy Oracle Appのツールget_schemaを呼び出します。

My Oracle Appのget_schemaを呼び出して


リモートMCPサーバーのツール呼び出しができました。

Claude Desktopではカスタムコネクタとして追加します。ChatGPTと同じ設定でカスタムコネクタを追加します。


追加したカスタムコネクタMy Oracle App連携させます。


Oracle IAMの認証プロセスが完了すると、連携/連携させるというボタンが設定に変わります。


設定をクリックすると、コネクタとして利用できるツールが確認できます。


ChatGPTと同様に、チャットから呼び出してみます。

My Oracle Appのget_schemaを呼び出して


Claude Desktopでも、カスタムコネクタとしてリモートMCPサーバーを呼び出すことができました。

今回の記事は以上です。