Oktaの開発者向けのプログラムである、Okta Integrator Free Planを使用します。以下のページにアクセスし、Okta PlatformのIntegrator Free Planにサインアップします。サインアップの条件及び手順については、Oktaからの情報を参照してください。
https://github.com/ujnak/apexapps/blob/master/exports/ords-jwt-test.zip
上記のAPEXアプリケーションをインストールすると、サポートするオブジェクトとして、APEXアプリケーション以外にいくつかのオブジェクトが作成されます。
データベース・オブジェクトとして、ファンクションDUMP_SIGNON_RESPONSE、PARSE_JWT(23ai以上)、MLEモジュールMOD_CORE_JS、MOD_JWT_DECODE、MOD_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のアプリケーション別名を変更します。
今回の作業はテストなので、割り当てのアクセス制御にOrganizationの全員にアクセスを許可を選択します。
セキュリティ・メニューのAPIを開き、認証サーバーを追加します。
以上で保存します。
アプリケーションORDS JWT Testが作成されます。
クライアントIDとシークレットをコピーします。これらはAPEXのWeb資格証明に設定します。
追加する認証サーバーの名前はORDS、オーディエンスはapi://ords(本来ordsの部分はGUIDを割り当てるのが望ましい)とします。この値は、発行されるアクセストークンのaud属性の値になります。説明としてAuthentication Server for ORDSを入力します。
以上で保存します。
メタデータURIは、APEXアプリケーションの認証スキームの検出URLとして設定するため、コピーして保存しておきます。
スコープの名前はORDSの権限と同じmyordsappとします。フレーズを表示に「ORDS REST APIにアクセスする」、説明も同じく「ORDS REST APIにアクセスする」を記述します。ユーザーの同意は暗黙とします。
Oktaのアクセス・トークンのスコープが属性scpで渡されている上、スコープが空白区切りではなく、JSON配列になっています。
Oktaの開発者フォーラムで紹介されていた、scope claimを追加する方法を実施します。
スコープを開きます。
ORDS REST APIは権限myordsappにて保護されています。そのため、スコープを追加します。
以上でスコープを作成します。
スコープとしてmyordsappが作成されました。
Oktaのアクセス・トークンのスコープが属性scpで渡されている上、スコープが空白区切りではなく、JSON配列になっています。
Oktaの開発者フォーラムで紹介されていた、scope claimを追加する方法を実施します。
追加するクレームの名前が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が作成されました。
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として設定し、変更を適用します。
以上で、APEXアプリケーションがOktaで認証されるようになりました。
APEXアプリケーションORDS JWT Testを実行します。
Oktaのサインイン・ページが開きます。
設定によりますが、Okta Verifyのコードを入力します。
パスワードを入力します。
User InfoにAPEXアプリケーションが受け取ったアクセス・トークンの内容が表示されます。
この中のiss属性の値とaud属性の値をコピーします。
issはORDS_SECURITY.CREATE_JWT_PROFILEの引数p_issuerの値、audはp_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のアプリケーション作成の参考になれば幸いです。
完

































