はじめに
Oracle Database の ORDS を使って、REST API として DB からデータを取得する方法や Select AI を実行する方法について記事を書きました。
今回の記事では、ORDS の機能を用いて外部に公開した REST API を、Auth0 の JWT アクセス トークンで保護する方法について記載します。
前提
この記事では、以下が準備済みであることを前提としています。
- Autonomous AI Database (ADB) が作成してあり、データを保存したテーブルが存在すること。
- データを取得するための REST API がすでに作成されていること。
手順
Auth0 のアカウントを作成
今回は無料版のアカウントを作成します。
アカウントの作成自体は難しいことはしないので省略。
アカウントの作成後、下記のようなカスタム API を作成します。
名前や識別子は適当で OK です。
- 名前 : Oracle ADB ORDS API
- 識別子 : https://oracle-ai-demo.example.com/ords
- 署名アルゴリズム : RS256
Identifier は実在URLでなくても構いません。
Auth0 側の API Identifier は、アクセス トークンの aud claim になります。
ORDS 側の p_audience と完全一致させる必要があります。
次にパーミッションを作成します。
こちらも適当な名称と説明で OK です。
- パーミッション : rest_api
- 説明 : Access Rest APIs
アプリケーションを作成します。
- 名前 : Demo React App
- アプリケーションの種類 : シングルページ Web アプリケーション
アプリケーションの設定から、「許可するCallback URL」、「許可するログアウトURL」、「許可するWebオリジン」に http://127.0.0.1:5173/ を指定します。
これはローカル検証用の URL なので、本番環境用の URL があるならカンマ区切りで追加します。
作成したアプリケーションの 「API Access」をチェックして、作成した API に対する「ユーザー アクセス」が Granted になっているかどうかをチェックします。
もしなっていない場合は、ユーザーアクセスに権限を付与します。
ADB 側の設定
OCI コンソールから、当該 ADB リソースのページへ移動します。
その後、データベース・アクションから「REST」をクリックします。
すると、Database Actions のページが開きます。

Database Actions から ORDS Privilege を作成します。
Privileges ページから作成が可能です。
Name には、Okta 側で作成した API の Permission を入力します。

Protected Modules には、予め作成した保護したい ORDS のモジュールを指定します。

次に ORDS JWT Profile を作成します。
対象のユーザーでログインして、下記のようなクエリを実行します。
- p_audience : Okta 側で作成した API の識別子
それ以外の dev-xxxxxxxx.jp.auth0.com の箇所は、自分の Auth0 のドメイン名を指定してください。
ドメイン名は Auth0 の作成したアプリケーションの画面で確認可能です。
BEGIN
ORDS_SECURITY.CREATE_JWT_PROFILE(
p_issuer => 'https://dev-xxxxxxxx.jp.auth0.com/',
p_audience => 'https://oracle-ai-demo.example.com/ords',
p_jwk_url => 'https://dev-xxxxxxxx.jp.auth0.com/.well-known/jwks.json',
p_description => 'Auth0 JWT profile for Demo ORDS APIs',
p_allowed_skew => 60,
p_allowed_age => 3600
);
COMMIT;
END;
/
Web アプリケーション側の実装
Web アプリケーションですが、フロントエンドとして React を使って実装します。
フロントエンドから Auth0 の認証を行い、JWT アクセストークンを使って ORDS の REST API を呼び出します。
フロントエンド側に、Auth0 で認証認可するための処理を追加します。
使っているフレームワークなどによって異なるので、Auth0 の公開情報を参考にする、コーディング エージェントの力を借りて実装するなどしてください。
Auth0 の作成したアプリケーションのクイックスタートにて、AI エージェントに指示出来るプロンプトをコピーすることが出来ます。
これを活用しましょう。
なお、フロントエンドから Auth0 のアクセス トークンを取得する際は、Auth0 の Application 情報に加えて、ORDS を保護するために作成した Auth0 API の Identifier と Permission を指定します。
たとえば、下記のような環境変数を用意します。
AUTH0_DOMAIN=dev-xxxxxxxx.jp.auth0.com
AUTH0_CLIENT_ID=<Auth0 Application の Client ID>
AUTH0_AUDIENCE=https://oracle-ai-demo.example.com/ords
AUTH0_SCOPE=openid profile email rest_api
AUTH0_AUDIENCE には、Auth0 で作成した API の Identifier を指定します。
この値はアクセス トークンの aud claim になり、ORDS JWT Profile の p_audience と一致している必要があります。
また、AUTH0_SCOPE には、Auth0 API で作成した Permission を含めます。
今回の例では Auth0 側で rest_api という Permission を作成し、ORDS 側でも同名の Privilege を作成しています。
そのため、フロントエンドが アクセス トークンを取得する際にも rest_api scope を要求します。
実際に試す
下図が、私が作成したフロントエンドの画面です。
右上に、ログインのためのボタンを配置しました。
ログイン ボタンをクリックすると、ログインする画面が表示されるので自分のユーザー情報を指定。
その後、下図のように Authorize の画面が出るので Accept をクリック。
そうすると、アクセス トークンが取得できます。
ORDS の REST API を呼び出す際に、取得したアクセス トークンを下記のように Header に指定する処理をフロントエンド側に実装しています。
GET /ords/<schema>/v1/customers/
Accept: application/json
Authorization: Bearer <取得した Auth0 のアクセス トークン>
そのため、保護された REST API を実行することが可能です。
私の検証用アプリケーションでも、下図のように結果が返ってきました。
試しに、Bearer Token を指定せずに ORDS の REST API を実行すると、期待どおり ADB から Unauthorized が返ってきました。
まとめ
ORDS を使うと、Oracle Database 上のデータや PL/SQL 処理を REST API として公開出来ます。
さらに ORDS JWT Profile と Privilege を組み合わせることで、Auth0 が発行したアクセス トークンを使ってAPI を保護できます。
例えば、デモ アプリケーション、小規模な業務アプリケーション、社内向けの限定的な API、または API Gateway を導入する前の検証段階では、この構成によりシンプルに実装を始められます。
ただし、公開範囲が広い API、複数システムから利用される API、細かい流量制御や監査ログ、WAF 連携、バックエンドの隠蔽が必要な API では、API Gateway などの専用レイヤーを前段に置く構成も検討した方がよいと考えます。
今回紹介した方法は、ORDS が備える JWT 検証機能を使って、Auth0 と連携した保護付き REST API を構成する一例です。
ご参考になれば幸いです。










