2025年12月19日金曜日

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

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

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

このモジュールの組み込みを簡単に行うために、UbuntuにOracle APEX環境を作りました。

Ubuntu 24.04では以下のコマンドを実行して、nginxのmore_clear_headersを含むモジュールをインストールします。

apt install libnginx-mod-http-headers-more-filter

Oracle Linux 10でもEPELリポジトリ(ol10_u0_developer_EPEL)にnginx-mod-headers-moreとして含まれていました。以下のコマンドを実行して、more_clear_headersを含むnginxのモジュールをインストールします。

dnf -y install nginx-mod-headers-more

ORDSの/ords/apexdev/sampleserver/mcpが401を返すときに、WWW-Authenticateヘッダーを置き換える設定は以下になります。ヘッダーにresource_metadataを含めています。

Postmanで動作を確認しました。

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

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


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

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


ここにscopeを入れることで、Microsoft Entra IDで保護しているリモートMCPサーバーでも、ChatGPTやClaude Desktopからアクセスできるようにできると思ったのですが、それだけでは無かったです。

とはいえ、WWW-Authenticateヘッダーを調整することにより、リソース・サーバーとしての設定を色々と変えられるようになりました。

今回の記事は以上です。