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