keycloak~RequiredActionProvider中獲取表單認證前URL的引數

张占岭發表於2024-04-26

在keycloak中,我們在進行brower瀏覽器的表單認證時,一般在跳到本頁面時,URL上會有redirect_uri這種引數,用來告訴keycloak,在認證成功後的跳轉地址,你在表單認證控制器中,可以透過context.getHttpRequest().getUri().getQueryParameters().getFirst("redirect_uri")進行獲取,而當你為brower認證流程新增RequiredAction行為之後,你需要在進入RequiredAction時帶上這些引數,你是不能直接透過getQueryParameters()方法獲取的,因為它之前的頁面不是來源頁,而是認證表單頁,那麼keycloak對於這種問題是如何處理的呢?

RequiredActionProvider中的方法

頁面渲染

 @Override
 public void requiredActionChallenge(RequiredActionContext context) {
    Response challenge = context.form()
                .createForm("login-sms-otp-config.ftl");
     context.challenge(challenge);
 }

表單提交

 @Override
 public void processAction(RequiredActionContext context) {
  context.success();
}

新增獲取認證表單中URL引數

很顯示,獲取上一個頁面的引數,應該在requiredActionChallenge渲染頁面方法中實現

  private static String getRedirectUri(RequiredActionContext context) {
    AuthenticationSessionModel authSession = context.getAuthenticationSession();

    if( authSession.getClientNotes().containsKey("redirect_uri")){
      return authSession.getClientNotes().get("redirect_uri");
    }
    return "https://www.abc.com";
  }

我們認證頁面將來源頁的引數臨時儲存到了authSession.getClientNotes()這個字典中,供認證流程中使用。

getClientNotes()返回的URL引數集合如下圖:

相關文章