2023年1月27日金曜日

異なるアプリケーションでのセッション共有について

 認証スキームが異なるアプリケーションで、セッション共有を行なった際の動作を確認します。

まずMain Appという空のアプリケーションを作成します。

認証スキームカスタムとして、以下のコードで認証します。ユーザー名がSCOTTの場合だけ、アプリケーションにアクセスできます。

function my_authentication (
    p_username in varchar2,
    p_password in varchar2 )
    return boolean
is
begin
    if p_username = 'SCOTT' then
        return true;
    end if;
    return false;
end;

異なるアプリケーションとセッションを共有するため、セッション共有Cookie名TEST_SESSION_SHARINGを設定します。

同様に空のアプリを作成します。名前はLogin Appとします。

認証スキームセッション共有も含み、同じ設定を行いますが、コードだけは以下に変更します。こちらはユーザー名としてTIGERだけが許可されます。

function my_authentication (
    p_username in varchar2,
    p_password in varchar2 )
    return boolean
is
begin
    if p_username = 'TIGER' then
        return true;
    end if;
    return false;
end;

Login Appのホーム・ページにプロセスを作成します。以下のコードを実行することで、アプリケーションの認証直後に、すぐにMain Appへリダイレクトします。apex_page.get_urlの引数p_sessionのデフォルトは、すでに開始しているセッションになります。

declare
    l_url varchar2(4000);
begin
    l_url := apex_page.get_url(
        p_application => 131
        ,p_page => 1
    );
    apex_util.redirect_url(
        p_url => l_url
    );
end;

Login Appにアクセスします。

Login AppにサインインできるユーザーはTIGERだけです。


サインインした直後にMain Appにリダイレクトします。セッションを共有しているため、Main Appの認証スキームによるサインインはバイパスされます。

Main Appの認証スキームでは本来認証されないユーザーであるTIGERで、Main Appにアクセスしていることが確認できます。


認証スキームが異なっていても、セッション共有はできます。場合によってはセキュリティ・ホールになるため、設定には注意が必要です。