2025年12月19日金曜日

リバース・プロキシとして構成したnginxでWWW-Authenticateヘッダーを書き換える

更新:2026年2月26日

Oracle REST Data Servicesに実装したリモートMCPサーバーをOAuth2で保護するにあたって、401エラーとともに返されるWWW-Authenticateヘッダーにresource_metadataやscopeを含める方法を調べてみました。

nginxにmore_clear_headersのモジュールを組み込みエラー・ページを置き換えることにより、WWW-Authenticateヘッダーを置き換えることができました。

nginxによるリバース・プロキシの実行環境の作成手順は、以下の記事で紹介しています。
nginxのmore_clear_headersは、Oracle Linuxではパッケージnginx-mod-headers-more(要EPEL)、Ubuntuではパッケージlibnginx-mod-http-headers-more-filter(要universe)に含まれています。

ORDSの/ords/apexdev/sampleserver/mcp(または他のMCPサーバーを実装したORDS RESTサービスのURI)が401を返すときに、WWW-Authenticateヘッダーを置き換える設定は以下になります。

more_clear_headersを呼び出しWWW-Authenticateヘッダーを削除した後、add_headerresource_metadataを含めたWWW-Authenticateヘッダーを追加しています。

このファイルを/etc/nginx/default.d/40-www-auth.confとして配置します。

MCPを実装しているORDS RESTサービスを呼び出す設定は以下になります。

/etc/nginx/default.d/30-mcp.confとして配置します。

Autonomous Databaseでは、以下を/etc/nginx/default.d/40-mcp-adb.confとして配置します。Autonomous Databaseではプライベート・エンドポイントまたは顧客管理ORDSを構成していないと、接続先ホスト名を変更できません。そのため、MCPを実装したORDS RESTサービスに限定してホスト名を置き換えています。

ords_upstream_hostにAutonomous Datatabaseのホスト名を設定します。

Oracle Linux 10のようにSELinuxが有効になっている場合は、ファイルの再ラベルが必要な場合があります。その後にnginxを再起動します。

restorecon -Rv /etc/nginx/
systemctl restart nginx

[root@ordsmcp ~]# restorecon -Rv /etc/nginx/

Relabeled /etc/nginx/default.d/30-mcp.conf from unconfined_u:object_r:admin_home_t:s0 to unconfined_u:object_r:httpd_config_t:s0

Relabeled /etc/nginx/default.d/40-www-auth.conf from unconfined_u:object_r:admin_home_t:s0 to unconfined_u:object_r:httpd_config_t:s0

[root@ordsmcp ~]# systemctl restart nginx

[root@ordsmcp ~]# 


proxy_intercept_errorsを無効にしていると、WWW-Authenticateヘッダーには以下の値が返されます。

Bearer realm="Oracle REST Data Services", error="invalid_token"

proxy_intercept_errorsを有効にすると、WWW-Authenticateヘッダーに、resource_metadataを含めることができます。。

Bearer resource_metadata="https://ホスト名/.well-known/oauth-protected-resource/ords/apexdev/sampleserver/mcp"

今回の記事は以上です。