LoginSignup
6
1

KeycloakのRequired Actionsをカスタマイズしてみる

Last updated at Posted at 2023-12-22

Required Actions とは

Required Actions とは、ユーザに必須で実行させるアクションを設定する機能であり、
例えば、初回ログイン時にプロフィール情報を登録させたり、OTP 認証の設定を実施させるようなケースで利用できます。
本記事では、Required Actions を動かしつつ、一部処理のカスタマイズして適用するところまで検証してみます。

Required Actions を試す

アカウント作成

検証用アカウントとして、2 つのアカウントを作成します。

ユーザー名 用途
user1 Required Actions を設定するユーザー
user2 Required Actions を設定しないユーザー

Required Actions の設定

有効化

AuthenticationRequired Actions を選択すると利用可能な Required Actions の一覧が表示される。
一覧のEnabledで Required Actions の有効/無効を切り替えることができる。設定したい Required Actions がある時は、まずここで有効化する必要がある。
また、Set as default actionというトグルスイッチがあり、こちらを有効にすると、新規でユーザーを作成した時に、デフォルトで対象の Required Actions がユーザーに適用される。

今回は、Update Passwordを利用するため、そちらが有効化されていることを確認する(デフォルト適用は OFF にする)

①-加工.png

ユーザー適用

個別にユーザーへ適用する場合は、個々のユーザーのdetailで設定する。以下のキャプチャのようにRequired user actionsというセレクトリストがあり、ここで利用可能な Required Actions を選択することができる。
今回はUpdate Passwordを利用したいため、user1で選択して、保存する。

②-加工.PNG

動作検証

user1 で検証

user1 でアカウントコンソール画面へログインすると、認証完了後にパスワード変更画面が表示される。

③.PNG
④.PNG

user2 で検証

user2 でアカウントコンソール画面へログインすると、認証完了後にパスワード変更画面が表示されず、直接アカウントコンソール画面へ遷移する。

⑤.PNG
⑥.PNG

ここまでで、Required Actions を設定すると、ユーザーに必須のアクションを適用できることが確認できた。

RequiredAction のカスタマイズ

カスタマイズ前

アカウントコンソールでは、ユーザー自身でパスワード変更することができる画面があり、今回はこちらの動きを変更する。

デフォルトでは、下記のキャプチャのようにパスワード変更すると、すぐにパスワード変更する画面が表示され、新しいパスワードを入力することで更新することができる。

⑦.PNG
⑧.PNG

セキュリティ観点で、よく重要処理前に再度認証情報を要求するケースがあり、今回パスワード変更についても、必ず再認証を行うようにカスタマイズをしてみる。

カスタマイズ

パスワード変更時、Keycloak のデフォルトでは 300 秒間は再認証不要となっており、最後の認証から 300 秒経過した場合は認証画面が表示されるようになっている。
今回はこちらを利用して都度認証画面が表示されるように改修する。

UpdatePasswordRequiredAction.java
public class UpdatePasswordRequiredAction implements RequiredActionProvider {

   ・・・

    @Override
    public void evaluateTriggers(RequiredActionContext context){
        ・・・
    }

    @Override
    public void processAction(RequiredActionContext context) {
        ・・・
    }

    /**
     * 認証有効時間を返却
     * @note 常に再認証を実行させるため固定で0を返却(デフォルトは300)
     * @return 0
     */
    @Override
    public int  getMaxAuthAge() {
        return 0;
    }
}

上記が今回改修したコードでkeycloakのUpdatePassword.javaを参考にgetMaxAuthAge()()で常に0(都度認証)が返るように変更しています。
getMaxAuthAge()はデフォルトではMaxAuthAgePasswordPolicyProviderFactory.DEFAULT_MAX_AUTH_AGEの値もしくは、パスワードポリシーで設定した期間が返るようになっています。

SPI 適用

Required Actionも同様にSPIでKeycloakに反映することができます。
作成したコードをmvn packageでJARを作成し、Keycloakのprovidersフォルダに配置するいつもの流れです。
フォルダ配置まで完了したらあとは動作確認を確認していきます。

Keycloak 起動

Keycloakを起動し、SPIが適用されると以下のようなコンソールログが出力されます。
WARNレベルのログですが、internalまたはprivateの依存関係を使用する場合に予告なく変更される可能性がある旨の警告のため、今回は特に気にする必要はありません。
バージョンアップなどの差異は注意が必要といった感じです。

> kc.bat start-dev
Updating the configuration and installing your custom providers, if any. Please wait.
2023-12-11 13:38:08,374 WARN  [org.keycloak.services] (build-7) KC-SERVICES0047: UPDATE_PASSWORD (org.keycloak.examples.requiredactions.UpdatePasswordRequiredActionFactory) is implementing the internal SPI required-action. This SPI is internal and may change without notice

動作検証

カスタマイズ前と同様にアカウントコンソールからパスワードを変更を操作してみます。

⑨.PNG
⑩.PNG
⑪.PNG

上記キャプチャの通り、前回は表示されなかった認証画面がパスワード変更画面の前に表示されることが確認できます。
念のため、すぐに同様のパスワード変更操作を実施すると、再度表示されるため、都度表示が実現できることが確認できる。

まとめ

今回はパスワード変更のRequired Actionsを用いて簡単なカスタマイズを検証してみた。
基本的にはRequiredActionProviderを継承したクラスを作成してSPIとして適用することで、任意の必須処理を追加できる。
Required ActionsはKeycloak上に登録しておけば、Authenticatorから認証フローの途中で条件に応じて適用したりなど、便利に使える機能であるため、Keycloak標準には無い独自の要件などの追加の際は、カスタマイズ方法の一つとして覚えておきたい。

参考資料

6
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
1