keycloak~session與token的關(guān)系
我們需要認(rèn)清session會話和token令牌的區(qū)別,在keycloak中,他們是不同的兩個概念,職責(zé)也不一樣。
session【session_state】
它被保存到瀏覽器的cookie中,有4個會話屬性,這主要基于高低版本瀏覽器和記住我功能考慮而設(shè)計的
按著kc系統(tǒng)獲取會話的優(yōu)先級,他們分別是:【帶_legacy是為了適應(yīng)不支持samesite屬性的瀏覽器】
1.?authsessionid(支持samesite屬性,會話級,關(guān)閉瀏覽器后過期)
2.?authsessionid_legacy
3.?keycloaksessionid?(開啟了KEYCLOAKREMEMBERME后,設(shè)置了過期時間,會在cookie添加這個屬性)
4.?keycloaksessionid_legacy
會話與瀏覽器cookie里設(shè)計的過期時間有關(guān),與token過期時間無關(guān),當(dāng)用戶退出時,kc服務(wù)器保持的會話【session_state】會被刪除,如圖為kc用戶的會話列表

token
由于kc中使用的是jwt(json?web?token),所以我們不需要把它再次進(jìn)行存儲了,因為在這個token里已經(jīng)有了用戶信息,并且添加了當(dāng)前會話信息;而傳統(tǒng)的而自解釋
的token,往往需要把它與當(dāng)前用戶作一個對應(yīng)關(guān)系,緩存起來,這點kc的jwt不需要存儲。
一?根據(jù)職責(zé),設(shè)置時長
??access_token?較短的有效期,如30分鐘,jwt的token中,會有用戶認(rèn)證和授權(quán)的信息
??refresh_token?較長的有效期,用戶最長可接受的,從新登錄的時間,如10天
二?token的驗證
??在線驗證:?為認(rèn)證服務(wù)器壓力比較大,相當(dāng)于去中心化校驗,因為kc存儲了session_state,可以更準(zhǔn)確的知道這個token是否在線
??離線驗證:各個服務(wù)端【對接到KC上的客戶端】,通過kc頒發(fā)的公鑰,對token進(jìn)行簽名驗證,它可以驗證出token是否由當(dāng)前KC頒發(fā)的,對于在線性,它無法直接驗證,當(dāng)然,客戶端自己也可以保留session_state,相當(dāng)于分擔(dān)KC的在線驗證的壓力
–?離線驗證的屬性至少要包括
??iss,token的頒發(fā)機(jī)構(gòu)
??exp,token的過期時間
??如果希望驗證實時在線性,那你至少要維護(hù)session_state與token的關(guān)系,用戶主動退出,需要清除它的關(guān)系
??/auth/realms/lind?來查看iss頒發(fā)的分鑰信息
{
????"realm":"lind",
????"public_key":"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyOCNCy8x",
????"token-service":"https://kc.com/auth/realms/fabao/protocol/openid-connect",
????"account-service":"https://kc.com/auth/realms/fabao/account",
????"tokens-not-before":1670507855
}
三?refreshtoken使用方式
refreshtoken去刷新token的方式方法,往往爭論不休,業(yè)界的做法也是多種多樣,其中使用最多的,還是在前端添加輪訓(xùn)操作,定時去通過refreshtoken去換新的accesstoken
??refreshToken()?{
??????this.refreshTime?=?setInterval(()?=>?{
????????checkToken(this.refreshLock,?this.$store)
??????},?60000)
????}