2023年3月3日金曜日

OpenID ConnectまたはOAuth2による認証の応答を印刷する

Oracle APEXのアプリケーションの認証スキームとしてOpenID Connectを使った際に、認証後のプロシージャとして以下のようなコードを書いています。

APEX側ではIdPからの応答であるJSON形式のメッセージをパースした状態(apex_json.parseを呼び出した状態)で、認証後のプロシージャを呼び出しています。そのため、IdPが応答としてどのようなメッセージを返すかが分かっていれば、apex_json.get_varchar2といったファンクションを呼び出すことでIdPから返された値を取得することができます。

IdPがどのような応答をするかはIdPに確認すべきことではあるのですが、とりあえず受信した応答をダンプするファンクションを作成してみました。

認証後に取得できるaccess_tokenおよびid_tokenの内容を表示する方法として、PL/SQLまたはMLE/JavaScriptのどちらかの実装を呼び出します。データベースが23より前のバージョンのときはPL/SQL、23以降はMLE/JavaScriptを呼び出すようにしています。

MLE/JavaScriptの実装では以下のコードを実行し、あらかじめファンクションPARSE_JWTを作成しておきます。実行の前に、スキーマにMLE/JavaScriptを呼び出す権限を与えておきます。

GRANT EXECUTE ON JAVASCRIPT TO <スキーマ>;
GRANT EXECUTE DYNAMIC MLE TO <スキーマ>;

アプリケーション・アイテムとしてG_USER_INFOを作成します。


認証スキーム認証後のプロシージャで値を設定します。



後は静的コンテンツのリージョンに以下のようにソースを記述すると、IdPの応答が画面に出力されます。

<pre>&G_USER_INFO.</pre>


以下のような表示になります。トークンなどは永続的なものではありませんが、センシティブな情報ではあるので、不要になったら認証後のプロシージャからコードは取り除いた方が安全でしょう。


以上になります。

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