Auth0はOktaから提供されているサービスになっています。以下のページにアクセスし、Auth0 Platformの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資格証明としてAuth0 JWT Testが作成されます。
APEXアプリケーションのインポートにより、APEX側で必要な作業のほとんどが実施されます。
以下より、Auth0にAPEXアプリケーションを登録する手順を説明します。
Auth0 Dashboardにサインインします。
アプリケーション・メニューのアプリケーションを開き、アプリケーションを作成します。
作成をクリックします。
クイックスタートにOracle APEXは含まれていません。設定タブを開き、ひとつひとつ設定します。
ドメインから、APEXアプリケーションの認証スキームに設定する検出URLが求められます。検出URLは以下になります。
https://[ドメイン]/.well-known/openid-configuration
クライアントIDはAPEXのWeb資格証明のクライアントIDまたはユーザー名、クライアントシークレットはクライアント・シークレットまたはパスワードに設定する値になります。
基本情報の下にあるアプリケーションのURIのセクションにスクロールします。
許可するCallback URLとして、APEXとして決められているコールバックURLを指定します。OpenID Connect向けのコールバックURLは、一般に以下の形式です。
警告が表示されます。パーミッションは1つだけなので、1つ選ぶだけですべてのスコープで付与を作成することになります。続行をクリックし、付与を実行します。
https://[ホスト名]/ords/apex_authentication.callback
許可するログアウトURLとして以下を設定します。インポートしたAPEXアプリケーションにはあらかじめログアウト向けのページが、ページ名LOGOUTとして作成されています。
カスタムAPIのORDSに、パーミッションとしてmyordsappが追加されました。
インポートしたアプリケーションの別名は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の呼び出し」と記述し、追加をクリックします。
APEXアプリケーションORDS JWT TestとカスタムAPIのORDSを紐付けます。
アプリケーションよりORDS JWT Testを選択し、APIタブを開きます。
ORDSを未認可から認可済に変更します。パーミッションの一覧が表示されるので、その中のmyordsappをチェックします。
以上で更新するをクリックします。
ユーザー管理メニューのユーザーを開き、アプリケーションORDS JWT Testにサインインするユーザーに、権限を割り当てます。
以上でパーミッションを追加します。
アプリケーションを実行し再度サインインすると、今度はスコープmyordsappの許可を求められます。
以上でAuth0での設定は完了です。
APEXに戻り、アプリケーションORDS JWT Testの認証スキームAuth0を開きます。
認証URIパラメータとして、以下を再度設定します。
audience=api://ords/
Acceptをクリックします。
アプリケーションORDS JWT Testのホーム・ページが開きます。
今度はUser Infoのaccess_tokenに、アクセス・トークンの内容が表示されます。
この中のiss属性の値とaud属性(これはapi://ords/)の値をコピーします。
issはORDS_SECURITY.CREATE_JWT_PROFILEの引数p_issuerの値、audはp_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のアプリケーション作成の参考になれば幸いです。
完

































































