keycloak~關于(yu)session idle和session max的解釋(shi)
keycloak可以幫(bang)助我(wo)們實現這(zhe)個功能:用(yong)戶token每5分鐘失效(xiao)一(yi)次,失效(xiao)后通(tong)過refresh_token來換(huan)新(xin)的token,而refresh_token每30天(tian)失效(xiao)一(yi)次,但(dan)如果用(yong)戶3天(tian)都沒有任(ren)何操作(就(jiu)是沒有用(yong)refresh_token去(qu)換(huan)新(xin)的token),那么(me)3天(tian)后也讓refresh_token失效(xiao),用(yong)戶需(xu)要從新(xin)去(qu)登錄(lu)。
先說refresh_token過期時間的配置
領(ling)域設置->Tokens中,有(you)四(si)個選項用來控制refresh_token的超時(shi)(shi)時(shi)(shi)間
- SSO Session Idle
- SSO Session Max
- Client Session Idle
- Client Session Max
上面4個(ge)選項,Max Session和(he)Client Session哪(na)(na)個(ge)大,refresh_token的(de)過期時間(jian)就用(yong)哪(na)(na)個(ge),如下配(pei)置(zhi)中,它的(de)過期時間(jian)就是30天;

當refresh_token到(dao)期(qi)之后 ,session就失效了,而它(ta)并(bing)不(bu)會立即清楚,它(ta)會交給keycloak進行維(wei)護,而用戶再進行刷新token時,會提(ti)示(shi)token是不(bu)活(huo)動的,在(zai)keycloak后臺會話的客(ke)戶端也被清空(kong),表(biao)示(shi)令(ling)牌過期(qi)了,如下面兩張圖(tu):


再說Session Idle和Session Max的作用
會話的(de)空閑時(shi)間(jian)(Idle),是(shi)指在多長(chang)時(shi)間(jian)之(zhi)內沒有使用(yong)refresh_token進行刷新(xin),這個會話(session_state)就(jiu)過期,無法再(zai)直接用(yong)refresh_token去(qu)換(huan)新(xin)的(de)token了,這時(shi)用(yong)戶(hu)就(jiu)需(xu)要(yao)重(zhong)新(xin)回(hui)到登錄頁,完成(cheng)新(xin)的(de)認(ren)證;這主要(yao)針對長(chang)時(shi)間(jian)不操作的(de)用(yong)戶(hu),kc需(xu)要(yao)讓(rang)它重(zhong)新(xin)完成(cheng)用(yong)戶(hu)名密碼的(de)確認(ren)。
注意:如(ru)(ru)何關注一下“記住我(wo)(wo)”這個功能(neng),因(yin)為如(ru)(ru)果(guo)開(kai)啟(qi)“記住我(wo)(wo)”功能(neng)之后,你的(de)會話空閑時(shi)間(jian)等于“記住我(wo)(wo)空閑時(shi)間(jian)”,你的(de)”sso session idle”配置將失效,如(ru)(ru)果(guo)記住我(wo)(wo)配置了(le)最大時(shi)間(jian)和空閑時(shi)間(jian),那么token的(de)生成(cheng)和校驗都將使用(yong)記住我(wo)(wo)的(de)時(shi)間(jian),如(ru)(ru)圖keycloak14.0.0.-services里AuthenticationManage.isSessionValid的(de)源碼。

如下圖配置了(le)access_token有效期2分鐘,refresh_token最(zui)長30天,會(hui)(hui)(hui)話空閑(xian)為7天;配置的作用(yong)(yong)為:用(yong)(yong)戶(hu)(hu)每2分鐘access_token會(hui)(hui)(hui)過(guo)期,然(ran)后(hou)用(yong)(yong)戶(hu)(hu)通過(guo)refresh_token去換新的access_token,如果用(yong)(yong)戶(hu)(hu)7天沒有換token,這個會(hui)(hui)(hui)話就過(guo)期,如果會(hui)(hui)(hui)話已經產生了(le)30天,則會(hui)(hui)(hui)話也過(guo)期,用(yong)(yong)戶(hu)(hu)就會(hui)(hui)(hui)返(fan)回登錄頁,重新認(ren)證。
后臺配置如下:

最后,還需要修改源碼:org.keycloak.protocol.oidc.TokenManager.refreshAccessToken()方法中的代碼,將verifyRefreshToken方法參數中的checkExpiration改成false,來滿足我們的要求,否則,你的session idle不起作用,因為refresh_token的超時時間用的是它,而開啟這個checkExpiration之后,當session idle到期后,上面的isSessionValid都走不(bu)到,所以我們(men)可以把它改(gai)成(cheng)false,讓會(hui)話(hua)過(guo)期的判斷留給isSessionValid方(fang)法來(lai)做。

有時,我們(men)在google上找不到答(da)案;有時,我們(men)在chatgpt上也找不到答(da)案;這(zhe)時,不防(fang)看(kan)看(kan)它的源碼(ma),從源碼(ma)中(zhong)找答(da)案!