元にしている記事は以下の2本です。
Auth0のOIDC認証にてAPEXアプリとそれから呼び出すORDSのREST APIを認証する
https://apexugj.blogspot.com/2025/12/verification-of-oauth-create-jwt-profile-auth0.html
Oracle REST Data ServicesのRole based JWT profileによる保護を確認する
https://apexugj.blogspot.com/2025/12/protecting-ords-by-role-based-jwt-profile.html
Auth0 Dashboardにサインインします。
記述が重複しますが、Auth0での確認作業について記載します。
Auth0 Dashboardにサインインします。
アプリケーション・メニューのアプリケーションを開き、アプリケーションを作成します。
名前はORDS MCPとし、アプリケーションの種類としてシングルページWebアプリケーションを選択します。
作成をクリックします。
設定タブを開きます。
ORDS_SECURITY.CREATE_JWT_PROFILEを呼び出す際の引数p_issuerの値は、ドメインの値をhttps://と/で囲んだ、https://ドメイン/になります。
oauth-protected-resourceに設定するauthorization_serversは、ドメインの値をhttps://と/で囲んだ、https://ドメイン/になります。
nginxからアクセスする/.well-known/oauth-authorization-serverは、以下のURLで取得するファイルとして作成します。
https://ドメイン/.well-known/oauth-authorization-server
上記のURLにアクセスし、属性jwks_uriの値を取得します。
基本情報のクライアントIDは、MCP InspectorのOAuth 2.0 FlowのClient IDに設定します。
Redirect URLはアプリケーションURIの許可するCallback URLに設定するため、コピーしておきます。
Auth0 Dashboardに戻り、アプリケーションの設定のアプリケーションのURLまでスクロールします。
許可するCallback URLに、MCP InspectorおよびChatGPTとClaude DesktopのコールバックURLを、カンマ区切りで設定します。
http://localhost:6274/oauth/callback,https://chatgpt.com/connector_platform_oauth_redirect,https://claude.ai/api/mcp/auth_callback
以上で設定を保存します。
アプリケーションのAPIを開き、APIの作成を実行します。
識別子として指定した値は、ORDS_SECURITY.CREATE_JWT_PROFILEを呼び出す際の引数p_audienceの値になります。また、oauth-protected-resourceに含まれるresource属性の値になります。
ORDSのREST APIをロール・ベースJWTプロファイルで保護するため、RBACを有効にします。
設定をスクロールし、RBACの設定に移動します。
RBACを有効化をオン、アクセストークンに権限を追加するをオンに変更します。
必ずしも必要ではありませんが、アクセスの設定のユーザー同意のスキップを許可するをオフにしています。
以上で変更を保存します。
JSON Web Token (JWT) プロファイルおよびJSON Web Token (JWT) の署名アルゴリズムはデフォルトをそのまま採用します。
以上で作成します。
ORDSのREST APIをロール・ベースJWTプロファイルで保護するため、RBACを有効にします。
設定をスクロールし、RBACの設定に移動します。
RBACを有効化をオン、アクセストークンに権限を追加するをオンに変更します。
必ずしも必要ではありませんが、アクセスの設定のユーザー同意のスキップを許可するをオフにしています。
以上で変更を保存します。
パーミッションタブを開きます。
パーミッションとしてORDSUsersを作成します。これをORDSではロール名と解釈するように、JWTプロファイルを作成します。説明に「ORDS REST APIの呼び出し」と記述し、追加をクリックします。
カスタムAPIのORDSMCPに、パーミッションとしてORDSUsersが追加されました。
ユーザー管理メニューのユーザーを開き、アプリケーションORDS MCPにサインインするユーザーに、権限を割り当てます。
以上でパーミッションを追加します。
謝辞:デフォルト・オーディエンスの設定はVictor Roninさんの以下の記事が参考になりました。
Configuring an MCP Server with Auth0 as the Authorization Serverユーザーの設定画面を開き、パーミッションタブより、パーミッションとしてORDSUsersが追加されていることを確認します。
MCPに限らないと思いますが、Auth0による認証ではアクセス・トークンのリクエスト時にaudienceが指定されていないと、アクセス・トークンとして暗号化されたトークンが返されます。
MCP InspectorのGitHubのIssue#566の議論が参考になります。
ワークアラウンドとして、Auth0にデフォルトのオーディエンスを設定します。
Auth0 Dashboardの設定の、一般設定タブを開きます。
APIの認可設定までスクロールし、デフォルトのオーディエンスとしてapi://ordsmcp/を設定します。
設定を保存します。
以上でAuth0の設定は完了です。
ロール・ベースJWTプロファイルを設定します。
ORDS_SECURITY.CREATE_JWT_PROFILEを実行します。それぞれの引数には、今まで集めた設定値を割り当てます。引数p_role_claim_nameには/permissionsを指定します。
begin
ords_security.delete_jwt_profile;
ords_security.create_jwt_profile(
p_issuer => 'https://ドメイン/'
,p_audience => 'api://ordsmcp/'
,p_jwk_url => 'https://ドメイン/.well-known/jwks.json'
,p_role_claim_name => '/permissions'
);
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]#
mv .well-known well-known.bak
mkdir .well-known
[root@apex html]# mv .well-known well-known.bak
[root@apex html]# mkdir .well-known
[root@apex html]#
リモートMCPサーバーのアクセスパスが/ords/apexdev/sampleserver/mcpなので、oauth-protected-resourceとして記述する内容は.well-known以下の.well-known/oauth-protected-resource/ords/apexdev/sampleserver/mcpに記述します。
ファイル.well-known/oauth-protected-resource/ords/apexdev/sampleserver/mcpを作成し、以下を記述します。
{
"resource": "api://ordsmcp/",
"authorization_servers": {
["https://ドメイン/"]
}
}
メタデータをダウンロードし、.well-known以下に配置します。curl -OL https://ドメイン/.well-known/oauth-authorization-server
mv oauth-authorization-server .well-known/
[root@apex html]# curl -OL https://dev-:************.us.auth0.com/.well-known/oauth-authorization-server
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 1960 0 1960 0 0 8622 0 --:--:-- --:--:-- --:--:-- 8634
[root@apex html]# mv oauth-authorization-server .well-known/
[root@apex html]#
以上で全体の設定が完了しました。
npx @modelcontextprotocol/inspector
Transport TypeにStreamable HTTPを選択し、URLにORDSのRESTモジュールとして実装されているサンプルのMCPサーバーのURLを設定します。
https://ホスト名/ords/apexdev/sampleserver/mcp
OAuth 2.0 FlowのClient IDに、Auth0に作成したアプリケーションORDS MCPのクライアントIDを設定します。
Connectをクリックし、認証プロセスを開始します。
ユーザー認証に成功しました。
以上でRole based JWT profileで保護したORDS REST APIを、MCP Inspectorでアクセスできました。
以下より、ブラウザ版のChatGPTで、このMCPサーバーをアプリとして作成してみます。ChatGPTに組み込むアプリはリソースとしてHTMLを返す必要があり、このMCPサーバーは要件を満たしてはいませんが、認証の確認はできます。
ChatGPTからの接続を確認する前に、nginxが返す/.well-known/oauth-protected-resource/ords/apexdev/sampleserver/mcpの内容を以下に変更します。ChatGPTはauthorization_serversの指定は配列であることを期待しています(仕様としてはこれが正しい)。また、scopes_supportedの指定が必要です。scopes_supportedについては、MCPサーバーにアクセスしたときにステータス401とともに返すWWW-Authenticateレスポンス・ヘッダーに、要求するスコープが含まれていることが期待されているようです。参照リンク
{
"resource": "api://ordsmcp/",
"authorization_servers": [
"https://ドメイン/"
],
"scopes_supported": ["files:read", "files:write"]
}ChatGPTのプランに依存すると思いますが(Plusプランで確認しています)ブラウザ版ChatGPTを開発者モードにすると、設定のアプリに高度な設定が表示されます。アプリを作成するをクリックします。
新しいアプリの名前はMy Oracle Appとします。説明として「Oracleデータベースに接続しSELECT文を実行します」を記述します。
MCPサーバーのURLは、MCP Inspectorに設定したURLと同じです。
https://ホスト名/ords/apexdev/sampleserver/mcp
認証にOAuthを選択し、OAuthクライアントIDに、Auth0に作成したアプリケーションORDS MCPのクライアントIDを設定します。
理解したうえで、続行しますをチェックし、作成するをクリックします。
サインインが完了すると、作成したアプリMy Oracle Appが接続します。
アクションとしてツールのget_schemaやrun_sqlが見えているので、OAuthによる認証は成功しています。
ここで使用したMCPサーバーはChatGPTアプリとしての実装は行なっていないため、何かができるわけではありませんが、OAuthで認証できることは確認できました。
Claude Desktopではカスタムコネクタとして追加します。ChatGPTと同じ設定でカスタムコネクタを追加します。
Claude Desktopでは、MCP Inspectorではなく、ChatGPTで使用した/.well-known/oauth-protected-resource/ords/apexdev/sampleserver/mcpで接続できました。































