2024年6月25日火曜日

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

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

Microsoft Azureのアカウントを作成すると利用できる、Microsoft Entra ID Freeを使用します。

検証作業に、以下の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資格証明としてMicrosoft Entra ID JWT Testが作成されます。


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

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

Microsoft Entra IDのホーム画面を開きます。


サイド・メニューよりアプリの登録を開きます。


新規登録をクリックします。


Microsoft Entra IDに登録するアプリケーションの名前ORDS JWT Testとします。サポートされているアカウントの種類この組織ディレクトリのみに含まれるアカウント(既存のディレクトリのみ - シングル・テナント)を選んでいますが、これは契約に依存するかと思います。今回の作業は、Microsoft Entra ID Freeの範囲で実施しています。

アプリケーションのタイプとしてWebを選択し、リダイレクトURIは以下を指定します。

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

以上を設定し、登録をクリックします。


アプリケーションが登録されます。

画面に表示されているアプリケーション(クライアント)IDは、APEXのWeb資格証明クライアントIDの値になります。コピーして保存しておきます。

証明書またはシークレットの追加をクリックし、シークレットを作成します。


新しいクライアント・シークレットをクリックします。


説明を入力し、追加をクリックします。


作成されたシークレットの値は、APEXのWeb資格証明クライアント・シークレットの値になります。コピーして保存しておきます。


概要に戻り、エンドポイントを開きます。


OpenID Connectメタデータドキュメントの値をコピーして保存します。この値が、APEXアプリケーションの認証スキームを作成する際の検出URLになります。


APIの公開を開き、Scopeの追加をクリックします。


アプリケーションIDのURIの設定を求められます。この値はJWTのaud属性の値、つまりaudienceの値になります。

保存してから続けるをクリックします。


スコープ名ORDSに設定した権限と同じ名前であるmyordsappとします。同意できるのはだれですか?管理者とユーザー管理者の同意の表示名は「ORDS REST APIの呼び出し」、管理者の同意の説明は「ORDS REST APIの呼び出しを許可します。」とします。状態有効とします。

以上で、スコープの追加をクリックします。


スコープが追加されます。追加されたスコープ(api:で始まる値)をコピーして保存します。この値は、APEXアプリケーションの認証スキーム有効範囲に設定します。


Microsoft Entra IDでの作業は以上です。

APEXでの作業に移ります。

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


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


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


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


認証スキームのMicrosoft Entra IDを開きます。


OpenID ConnectメタデータドキュメントのURLを設定検出URLとして設定し、有効範囲(scope)にapi:で始まるスコープmyordsappを追加します。

以上で変更を適用します。


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


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

動作を確認します。

APEXアプリケーションを実行すると、Microsoft Entra IDによるサインインが求められます。


構成に依存しますが、MFAのための通知の送信を行います。


Microsoft Authenticatorでの承認を求められます。


サインインの状態を維持しますか?と確認されます。テストでのサインインなので、はいいいえのどちらを選択しても大きな違いはありません。


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

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

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

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


Microsoft Entra IDのOpenID ConnectメタデータカタログのURL(APEXアプリの認証スキームの検出URL - /.well-known/openid-configurationで終了する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のレスポンスが表示されます。


今回の記事は以上です。

Microsoft Entra IDが発行したアクセス・トークンを使って、ORDSのREST APIを認証できることが確認できました。