以下の記事に記載されている手順を実施済みとします。
Oracle IAMのOIDC認証にてAPEXアプリとそれから呼び出すORDSのREST APIを認証する
https://apexugj.blogspot.com/2024/06/verification-of-oauth-create-jwt-profile-oracle-iam.html
Oracle IAMの統合アプリにカスタム・クレームを追加しRole based JWT profileによる保護を確認する
本記事では、以下の作業が完了していることを前提とします。
- 発行者(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 FlowのClient 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 REST APIの保護とアクセスに必要な設定を集めます。
発行者はデフォルト値としているので、ORDS_SECURITY.CREATE_JWT_PROFILEを呼び出す際に、引数p_issuerに与える値はhttps://identity.oraclecloud.com/になります。
Defaultドメインの詳細に記載されているドメインURLが、ORDS_SECURITY.CREATE_JWT_PROFILEを呼び出す際に、引数p_audienceに与える値になります。また、この値はoauth-protected-resourceのresource属性に設定する値になります。
https://ドメインURL/.well-known/openid-configuration
上記のURLにブラウザよりアクセスし、属性jwks_uriの値を取得します。この値は、ORDS_SECURITY.CREATE_JWT_PROFILEを呼び出す際に、引数p_jwk_urlに与える値になります。
oauth-protected-resourceのauthorization_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]#
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にドメインURL、authorization_serversにもドメインURLを設定します。
{
"resource": "ドメインURL",
"authorization_servers": {
"ドメインURL"
}
}
authorization_serversの設定で、JSON配列ではなく{}で囲んでJSONオブジェクトにしています。構文的に間違っていますが、authorization_serversが認識できないと、認可サーバーの代わりにリソース・サーバー上の/.well-known/oauth-authorization-serverにアクセスするため、わざとこうしています。メタデータをダウンロードし、.well-known以下に配置します。
curl -O ドメインURL/.well-known/openid-configuration
mv openid-configuration .well-known/oauth-authorization-server
[root@apex html]# curl -O https://idcs-****************.identity.oraclecloud.com:443/.well-known/openid-configuration
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 3166 100 3166 0 0 81621 0 --:--:-- --:--:-- --:--:-- 83315
[root@apex html]# mv openid-configuration .well-known/oauth-authorization-server
[root@apex html]#
以上で全体の設定が完了しました。
MCP Inspectorを起動します。
npx @modelcontextprotocol/inspector
Transport TypeにStreamable HTTPを選択し、URLにORDSのRESTモジュールとして実装されているサンプルのMCPサーバーのURLを設定します。
https://ホスト名/ords/apexdev/sampleserver/mcp
OAuth 2.0 FlowのClient IDに、Oracle IAMに作成した統合アプリケーションORDS MCPのクライアントIDを設定します。
Connectをクリックし、認証プロセスを開始します。
Oracle IAMのサインインの画面に遷移します。
以上でRole based JWT profileで保護したORDS REST APIを、MCP Inspectorでアクセスできました。
記事「Role based JWT profileで保護したORDS REST APIにMCP Inspectorでアクセスする - Auth0編」と同じ作業を行い、ChatGPTのアプリ、およびClaude Desktopのカスタムコネクタを作成してみました。
ChatGPTからの接続を確認する前に、nginxが返す/.well-known/oauth-protected-resourceの内容を以下に変更します。ChatGPTはauthorization_serversの指定は配列であることを期待しています。
{
"resource": "ドメインURL",
"authorization_servers": [
"ドメインURL"
]
}上記の設定で、ChatGPTアプリおよびClaude Desktopのカスタムコネクタとして作成できました。
今回の記事は以上です。
完





















