keycloak~關(guān)于session idle和session max的解釋
keycloak可以幫助我們實(shí)現(xiàn)這個(gè)功能:用戶(hù)token每5分鐘失效一次,失效后通過(guò)refresh_token來(lái)?yè)Q新的token,而refresh_token每30天失效一次,但如果用戶(hù)3天都沒(méi)有任何操作(就是沒(méi)有用refresh_token去換新的token),那么3天后也讓refresh_token失效,用戶(hù)需要從新去登錄。
先說(shuō)refresh_token過(guò)期時(shí)間的配置
領(lǐng)域設(shè)置->Tokens中,有四個(gè)選項(xiàng)用來(lái)控制refresh_token的超時(shí)時(shí)間
- SSO Session Idle
- SSO Session Max
- Client Session Idle
- Client Session Max
上面4個(gè)選項(xiàng),Max Session和Client Session哪個(gè)大,refresh_token的過(guò)期時(shí)間就用哪個(gè),如下配置中,它的過(guò)期時(shí)間就是30天;

當(dāng)refresh_token到期之后 ,session就失效了,而它并不會(huì)立即清楚,它會(huì)交給keycloak進(jìn)行維護(hù),而用戶(hù)再進(jìn)行刷新token時(shí),會(huì)提示token是不活動(dòng)的,在keycloak后臺(tái)會(huì)話的客戶(hù)端也被清空,表示令牌過(guò)期了,如下面兩張圖:


再說(shuō)Session Idle和Session Max的作用
會(huì)話的空閑時(shí)間(Idle),是指在多長(zhǎng)時(shí)間之內(nèi)沒(méi)有使用refresh_token進(jìn)行刷新,這個(gè)會(huì)話(session_state)就過(guò)期,無(wú)法再直接用refresh_token去換新的token了,這時(shí)用戶(hù)就需要重新回到登錄頁(yè),完成新的認(rèn)證;這主要針對(duì)長(zhǎng)時(shí)間不操作的用戶(hù),kc需要讓它重新完成用戶(hù)名密碼的確認(rèn)。
注意:如何關(guān)注一下“記住我”這個(gè)功能,因?yàn)槿绻_(kāi)啟“記住我”功能之后,你的會(huì)話空閑時(shí)間等于“記住我空閑時(shí)間”,你的”sso session idle”配置將失效,如果記住我配置了最大時(shí)間和空閑時(shí)間,那么token的生成和校驗(yàn)都將使用記住我的時(shí)間,如圖keycloak14.0.0.-services里AuthenticationManage.isSessionValid的源碼。

如下圖配置了access_token有效期2分鐘,refresh_token最長(zhǎng)30天,會(huì)話空閑為7天;配置的作用為:用戶(hù)每2分鐘access_token會(huì)過(guò)期,然后用戶(hù)通過(guò)refresh_token去換新的access_token,如果用戶(hù)7天沒(méi)有換token,這個(gè)會(huì)話就過(guò)期,如果會(huì)話已經(jīng)產(chǎn)生了30天,則會(huì)話也過(guò)期,用戶(hù)就會(huì)返回登錄頁(yè),重新認(rèn)證。
后臺(tái)配置如下:

最后,還需要修改源碼:org.keycloak.protocol.oidc.TokenManager.refreshAccessToken()方法中的代碼,將verifyRefreshToken方法參數(shù)中的checkExpiration改成false,來(lái)滿足我們的要求,否則,你的session idle不起作用,因?yàn)閞efresh_token的超時(shí)時(shí)間用的是它,而開(kāi)啟這個(gè)checkExpiration之后,當(dāng)session idle到期后,上面的isSessionValid都走不到,所以我們可以把它改成false,讓會(huì)話過(guò)期的判斷留給isSessionValid方法來(lái)做。

有時(shí),我們?cè)趃oogle上找不到答案;有時(shí),我們?cè)赾hatgpt上也找不到答案;這時(shí),不防看看它的源碼,從源碼中找答案!
浙公網(wǎng)安備 33010602011771號(hào)