keycloak~RequiredActionProvider中獲取表單認(rèn)證前URL的參數(shù)
在keycloak中,我們?cè)谶M(jìn)行brower瀏覽器的表單認(rèn)證時(shí),一般在跳到本頁(yè)面時(shí),URL上會(huì)有redirect_uri這種參數(shù),用來(lái)告訴keycloak,在認(rèn)證成功后的跳轉(zhuǎn)地址,你在表單認(rèn)證控制器中,可以通過(guò)context.getHttpRequest().getUri().getQueryParameters().getFirst("redirect_uri")進(jìn)行獲取,而當(dāng)你為brower認(rèn)證流程添加RequiredAction行為之后,你需要在進(jìn)入RequiredAction時(shí)帶上這些參數(shù),你是不能直接通過(guò)getQueryParameters()方法獲取的,因?yàn)樗暗捻?yè)面不是來(lái)源頁(yè),而是認(rèn)證表單頁(yè),那么keycloak對(duì)于這種問(wèn)題是如何處理的呢?
RequiredActionProvider中的方法
頁(yè)面渲染
@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();
}
添加獲取認(rèn)證表單中URL參數(shù)
很顯示,獲取上一個(gè)頁(yè)面的參數(shù),應(yīng)該在requiredActionChallenge渲染頁(yè)面方法中實(shí)現(xiàn)
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";
}
我們認(rèn)證頁(yè)面將來(lái)源頁(yè)的參數(shù)臨時(shí)存儲(chǔ)到了authSession.getClientNotes()這個(gè)字典中,供認(rèn)證流程中使用。
getClientNotes()返回的URL參數(shù)集合如下圖:

浙公網(wǎng)安備 33010602011771號(hào)