2025年12月11日木曜日

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

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

Auth0はOktaから提供されているサービスになっています。以下のページにアクセスし、Auth0 Platformの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資格証明としてAuth0 JWT Testが作成されます。


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

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

Auth0 Dashboardにサインインします。

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


名前ORDS JWT Testとし、アプリケーションの種類として一般的なWebアプリケーションを選択します。

作成をクリックします。


クイックスタートにOracle APEXは含まれていません。設定タブを開き、ひとつひとつ設定します。


基本情報を確認します。

ドメインから、APEXアプリケーションの認証スキーム設定する検出URLが求められます。検出URLは以下になります。

https://[ドメイン]/.well-known/openid-configuration

クライアントIDはAPEXのWeb資格証明クライアントIDまたはユーザー名クライアントシークレットクライアント・シークレットまたはパスワードに設定する値になります。


APEXアプリケーションをAuth0で認証する最低限の設定を行います。

基本情報の下にあるアプリケーションのURIのセクションにスクロールします。

許可するCallback 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:::

以上で保存します。


APEXでの作業に移ります。

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


Web資格証明Auth0 JWT Testを開きます。


Auth0のアプリケーションの基本情報にあるクライアントIDを、Web資格証明クライアントIDまたはユーザー名に設定します。同様にクライアントシークレットクライアント・シークレットまたはパスワードに設定します。

変更を適用します。


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


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


基本情報ドメインから求められるURLを、検出URLに設定します。

https://ドメイン/.well-knows/openid-configuration

認証URIパラメータとしてaudience=api://ords/が設定されています。これはORDS REST APIをJWTプロファイルを使って認証する際に必要となるパラメータです。まだ、Auth0側でアプリケーションORDS JWT TestにAPIを紐付けていないため、この設定は一旦削除します。

変更を適用します。


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


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

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


Auth0のサインイン・ページが開きます。ユーザーをGoogleと紐づけているので、Continue with Googleでサインインします。サインインの手順は、ユーザーの設定に依存します。


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

User InfoにAPEXアプリケーションが受け取ったアクセス・トークンが、パースされずに表示されています。


先ほど認証スキーム認証URIパラメータよりaudience=api://ords/を削除しました。Auth0はaudienceの指定がないと、JWEとしてA256GCMで暗号化されたアクセス・トークンを返します。audienceを指定することにより、暗号化されていないJWTが返されるようになります。

謝辞:Tyler TarwaterさんのMediumの記事「JWT with Oracle APEX and ORDS

Auth0 Dashboardに戻り、APIを作成します。

アプリケーションAPIを開き、APIの作成を実行します。


APIの名前ORDS識別子としてapi://ords/を設定します。

本来はordsの代わりに世界で一意になる文字列(GUIDなど)を設定します。Auth0では識別子のプレースホルダーがhttps://your-api-endpoint/となっているので、APIのエンドポイントURL(これも世界で一意になるはず)を想定しているようです。

この識別子は、ORDS_SECURITY.CREATE_JWT_PROFILEの引数p_audienceの値になります。

以上を設定し、APIを作成します。


カスタムAPIとしてORDSが作成されます。


APIにスコープ(Auth0 Dashboardではパーミッションにあたる)を設定するために、RBACを有効にします。

設定をスクロールし、RBACの設定に移動します。

RBACを有効化オンアクセストークンに権限を追加するオンに変更します。

必ずしも必要ではありませんが、アクセスの設定ユーザー同意のスキップを許可するオフにしています。

以上で変更を保存します。


パーミッションタブを開きます。

パーミッションとしてmyordsappを作成します。これはORDSに作成した権限の名前に一致させます。説明に「ORDS REST APIの呼び出し」と記述し、追加をクリックします。


カスタムAPIのORDSに、パーミッションとしてmyordsappが追加されました。


APEXアプリケーションORDS JWT TestとカスタムAPIのORDSを紐付けます。

アプリケーションよりORDS JWT Testを選択し、APIタブを開きます。

ORDSを未認可から認可済に変更します。パーミッションの一覧が表示されるので、その中のmyordsappチェックします。

以上で更新するをクリックします。


警告が表示されます。パーミッションは1つだけなので、1つ選ぶだけですべてのスコープで付与を作成することになります。続行をクリックし、付与を実行します。


以上でアプリケーションORDS JWT Testにスコープmyordsappが付与されました。

ユーザー管理メニューのユーザーを開き、アプリケーションORDS JWT Testにサインインするユーザーに、権限を割り当てます。


APIとしてORDSを選択し、パーミッションmyordsappチェックします。

以上でパーミッションを追加します。


以上でAuth0での設定は完了です。

APEXに戻り、アプリケーションORDS JWT Testの認証スキームAuth0を開きます。

認証URIパラメータとして、以下を再度設定します。

audience=api://ords/


アプリケーションを実行し再度サインインすると、今度はスコープmyordsappの許可を求められます。

Acceptをクリックします。


アプリケーションORDS JWT Testのホーム・ページが開きます。

今度はUser Infoのaccess_tokenに、アクセス・トークンの内容が表示されます。

この中のiss属性の値とaud属性(これはapi://ords/)の値をコピーします。

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


APEXアプリの認証スキームAuth0検出URLとして設定したURL - (https://ドメイン/.well-known/openid-configuration)にアクセスし、jwks_uri属性の値をコピーします。これは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のレスポンスが表示されます。

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

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

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のアプリケーション作成の参考になれば幸いです。