2025年12月9日火曜日

OktaのOIDC認証にてAPEXアプリとそれから呼び出すORDSのREST APIを認証する

OktaのOpenID Connect認証でOracle APEXのアプリケーションを認証し、その際に発行されたアクセス・トークンを使用してOracle REST Data ServicesのREST APIを認証します。Oracle REST Data ServicesではJWTプロファイルを設定することにより、Oktaが発行したアクセス・トークンで認証します。

Oktaの開発者向けのプログラムである、Okta Integrator Free Planを使用します。以下のページにアクセスし、Okta PlatformのIntegrator Free Planにサインアップします。サインアップの条件及び手順については、Oktaからの情報を参照してください。


検証作業に、以下のAPEXアプリケーションORDS JWT Testをインポートして使用します。
https://github.com/ujnak/apexapps/blob/master/exports/ords-jwt-test.zip

上記のAPEXアプリケーションをインストールすると、サポートするオブジェクトとして、APEXアプリケーション以外にいくつかのオブジェクトが作成されます。

データベース・オブジェクトとして、ファンクションDUMP_SIGNON_RESPONSEPARSE_JWT(23ai以上)、MLEモジュールMOD_CORE_JSMOD_JWT_DECODEMOD_PARSE_JWT(23ai以上)、MLE環境JWTENV(23ai以上)が作成されます。

RESTサービスとしてprintが作成されます。権限myordsappが作成され、作成されたRESTサービスprintは権限myordsappにより保護されます。

Web資格証明としてOkta JWT Testが作成されます。


APEXアプリケーションのインポートにより、APEX側で必要な作業のほとんどが実施されます。

以下より、OktaにAPEXアプリケーションを登録する手順を説明します。

OktaのAdmin Consoleにサインインします。

アプリケーション・メニューのアプリケーションを開き、アプリ統合を作成します。


新しいアプリ統合を作成のダイアログが開きます。

サインイン方法OIDC - OpenID Connectを選択します。OIDC - OpenID Connectを選択すると、アプリケーションタイプの選択を求められます。アプリケーションタイプにはWebアプリケーションを選択します。

次へ進みます。


アプリ統合名ORDS JWT Testとします。

サインインリダイレクトURLは、APEXとして決められているコールバックURLを指定します。OpenID Connect向けのコールバックURLは、一般に以下の形式です。

https://[ホスト名]/ords/apex_authentication.callback

サインアウトリダイレクトURLとして以下を設定します。インポートしたAPEXアプリケーションにはあらかじめログアウト向けのページが、ページ名LOGOUTとして作成されています。

インポートしたアプリケーションの別名はORDS-JWT-TESTですが、同名のアプリケーションがある場合は、インポート時にアプリケーション別名が変更されます。その場合は、以下のURLのアプリケーション別名を変更します。

https://[ホスト名]/ords/f?p=ORDS-JWT-TEST:LOGOUT:0::NO:::

今回の作業はテストなので、割り当てアクセス制御Organizationの全員にアクセスを許可を選択します。

以上で保存します。


アプリケーションORDS JWT Testが作成されます。

クライアントIDシークレットをコピーします。これらはAPEXのWeb資格証明に設定します。


セキュリティ・メニューのAPIを開き、認証サーバーを追加します。


追加する認証サーバーの名前ORDSオーディエンスapi://ords(本来ordsの部分はGUIDを割り当てるのが望ましい)とします。この値は、発行されるアクセストークンのaud属性の値になります。説明としてAuthentication Server for ORDSを入力します。

以上で保存します。


認証サーバーが追加されます。

メタデータURIは、APEXアプリケーションの認証スキーム検出URLとして設定するため、コピーして保存しておきます。


スコープを開きます。

ORDS REST APIは権限myordsappにて保護されています。そのため、スコープを追加します。


スコープの名前はORDSの権限と同じmyordsappとします。フレーズを表示に「ORDS REST APIにアクセスする」、説明も同じく「ORDS REST APIにアクセスする」を記述します。ユーザーの同意暗黙とします。

以上でスコープを作成します。


スコープとしてmyordsappが作成されました。


Oktaのアクセス・トークンのスコープが属性scpで渡されている上、スコープが空白区切りではなく、JSON配列になっています。

Oktaの開発者フォーラムで紹介されていた、scope claimを追加する方法を実施します。
Scope/scp and space delimited string in access token

クレームを開き、クレームを追加します。


追加するクレームの名前scopeになります。トークンタイプに含めるアクセストークン値タイプを選択し、として以下を記述します。

String.replace(Arrays.toCsvString(access.scope),","," ")

含めるいずれかのスコープとし、作成します。


クレームとしてscopeが作成されました。


アクセスポリシーを開き、ポリシーを追加します。


ポリシーの名前All Clientsとします。説明に「すべてのクライアント」と記述し、次に割り当てるすべてのクライアントを選択します。

以上でポリシーを作成します。


アクセスポリシーとしてAll Clientsが作成されました。

ルールを追加します。


ルール名APEX & ORDSとします。

付与タイプクライアントの資格情報(Client Credentials)、認証コード(Authorization Code)をチェックします。今回はデバイス認証(Device Authorization)は使用しませんが、チェックしておきます。

ユーザーとして、アプリに割り当てられているユーザーを選択します。

要求されたスコープとして、いずれかのスコープ(Any scopes)を選択します。

以上でルールを作成します。


アクセスポリシーAll ClientsとルールAPEX & ORDSが作成されました。


以上でOktaでの作業は完了です。

APEXでの作業に移ります。

ワークスペース・ユーティリティWeb資格証明を開きます。


APEXアプリケーションords-jwt-test.zipをインポートすると、Web資格証明としてOkta JWT Testが作成されます。


Oktaで作成したアプリケーションORDS JWT TestクライアントIDおよびシークレットを設定し、変更を適用します。


APEXアプリケーションORDS JWT Test共有コンポーネント認証スキームを開きます。


認証スキームOktaを開きます。


Oktaで作成した認証サーバーORDSのメタデータURIを、設定検出URLとして設定し、変更を適用します。


認証スキームOktaを再度開き、カレント・スキームにします


以上で、APEXアプリケーションがOktaで認証されるようになりました。

APEXアプリケーションORDS JWT Testを実行します。


Oktaのサインイン・ページが開きます。


設定によりますが、Okta Verifyのコードを入力します。


パスワードを入力します。


APEXアプリケーションORDS JWT Testのホーム・ページが開きます。ORDS REST APIの呼び出しは失敗しています。

User InfoにAPEXアプリケーションが受け取ったアクセス・トークンの内容が表示されます。

この中のiss属性の値とaud属性の値をコピーします。

issORDS_SECURITY.CREATE_JWT_PROFILEの引数p_issuerの値、audp_audienceの値になります。


Oktaの認証サーバーORDSのメタデータURI(APEXアプリの認証スキームの検出URL - /.well-known/oauth-authorization-serverで終了するURL)にアクセスし、jwks_uri属性の値(通常keysで終了)をコピーします。これはORDS_SECURITY.CREATE_JWT_PROFILEの引数p_jwk_urlの値になります。


SQLワークショップSQLコマンドより、ORDS_SECURITY.CREATE_JWT_PROFILEを実行します。
begin
    ords_security.delete_jwt_profile;
    ords_security.create_jwt_profile(
        p_issuer => 'iss属性の値'
        ,p_audience => 'aud属性の値'
        ,p_jwk_url => 'jwks_uri属性の値'
    );
end;
/

APEXアプリケーションのホーム・ページに再度アクセスします。

今度はJWTプロファイルが設定されたため、正常にREST APIのレスポンスが表示されます。


以上でOktaのOIDC認証にて、APEXアプリとそれから呼び出すORDSのREST APIを認証できました。

Oracle APEXのアプリケーション作成の参考になれば幸いです。