2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

[ORDS] Auth0(Okta)のJWTアクセストークンでREST APIを保護する

2
Posted at

はじめに

Oracle Database の ORDS を使って、REST API として DB からデータを取得する方法や Select AI を実行する方法について記事を書きました。

今回の記事では、ORDS の機能を用いて外部に公開した REST API を、Auth0 の JWT アクセス トークンで保護する方法について記載します。

参考資料 : https://docs.oracle.com/en/database/oracle/oracle-rest-data-services/25.4/orddg/developing-REST-applications.html#GUID-A1CD111F-724B-4E91-8202-FA899EE521F1

前提

この記事では、以下が準備済みであることを前提としています。

  • Autonomous AI Database (ADB) が作成してあり、データを保存したテーブルが存在すること。
  • データを取得するための REST API がすでに作成されていること。

手順

Auth0 のアカウントを作成

今回は無料版のアカウントを作成します。
アカウントの作成自体は難しいことはしないので省略。

アカウントの作成後、下記のようなカスタム API を作成します。
名前や識別子は適当で OK です。

Identifier は実在URLでなくても構いません。
Auth0 側の API Identifier は、アクセス トークンの aud claim になります。
ORDS 側の p_audience と完全一致させる必要があります。

image.png

次にパーミッションを作成します。
こちらも適当な名称と説明で OK です。

  • パーミッション : rest_api
  • 説明 : Access Rest APIs

image.png

アプリケーションを作成します。

  • 名前 : Demo React App
  • アプリケーションの種類 : シングルページ Web アプリケーション

image.png

アプリケーションの設定から、「許可するCallback URL」、「許可するログアウトURL」、「許可するWebオリジン」に http://127.0.0.1:5173/ を指定します。
これはローカル検証用の URL なので、本番環境用の URL があるならカンマ区切りで追加します。

image.png

作成したアプリケーションの 「API Access」をチェックして、作成した API に対する「ユーザー アクセス」が Granted になっているかどうかをチェックします。
もしなっていない場合は、ユーザーアクセスに権限を付与します。

image.png

ADB 側の設定

OCI コンソールから、当該 ADB リソースのページへ移動します。
その後、データベース・アクションから「REST」をクリックします。
すると、Database Actions のページが開きます。
image.png

Database Actions から ORDS Privilege を作成します。
Privileges ページから作成が可能です。

image.png

Name には、Okta 側で作成した API の Permission を入力します。
image.png

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

次に 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 エージェントに指示出来るプロンプトをコピーすることが出来ます。
これを活用しましょう。

image.png

なお、フロントエンドから 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 を要求します。

実際に試す

下図が、私が作成したフロントエンドの画面です。
右上に、ログインのためのボタンを配置しました。

image.png

ログイン ボタンをクリックすると、ログインする画面が表示されるので自分のユーザー情報を指定。
その後、下図のように Authorize の画面が出るので Accept をクリック。
そうすると、アクセス トークンが取得できます。

image.png

ORDS の REST API を呼び出す際に、取得したアクセス トークンを下記のように Header に指定する処理をフロントエンド側に実装しています。

GET /ords/<schema>/v1/customers/
Accept: application/json
Authorization: Bearer <取得した Auth0 のアクセス トークン>

そのため、保護された REST API を実行することが可能です。
私の検証用アプリケーションでも、下図のように結果が返ってきました。

image.png

試しに、Bearer Token を指定せずに ORDS の REST API を実行すると、期待どおり ADB から Unauthorized が返ってきました。

image.png

まとめ

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 を構成する一例です。
ご参考になれば幸いです。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?