keycloak存到cookie中的值
- AUTH_SESSION_ID
- KEYCLOAK_IDENTITY
- KEYCLOAK_SESSION
AUTH_SESSION_ID
使用者的當前session_state,它是會話級的,關閉瀏覽器就沒了
KEYCLOAK_IDENTITY
它是使用者跨端登入的基礎,它也是一個jwt串,解析後是這樣的結果,使用者在當前端沒有登入時,會跳到kc認證頁,當發現cookie裡的kc域下有這個KEYCLOAK_IDENTITY
,會使用這個session_state
進行認證,沒有這個鍵,KC認證不能完成。
{
"exp": 1682659005,
"iat": 1680067005,
"jti": "d655a51e-f363-43cf-9f3e-1be8c4f7f082",
"iss": "https://finalcas.pkulaw.com/auth/realms/fabao",
"sub": "347c9e9e-076c-45e3-be74-c482fffcc6e5",
"typ": "Serialized-ID",
"session_state": "4b020044-d273-41c6-9cea-c9ea1b0814f7",
"state_checker": "SGniuhvr-FbQ7aznFTiTDIi2Gt4CKev7DI3vLNvJufo"
}
注意:如果瀏覽器的cookie裡的KEYCLOAK_IDENTITY丟失了,會導致KC出現無法登入的問題,解決方法只能是清除瀏覽器裡的AUTH_SESSION_ID和KEYCLOAK_SESSION,注意還有字尾為LEGACY的鍵值.
KEYCLOAK_SESSION
當你可算讓KC記住你的登入狀態,這時KC會在cookie中生成KEYCLOAK_SESSION
,它的值預設與AUTH_SESSION_ID相同,當是一個包含過期時間的cookie,瀏覽器關閉後它依然保持,直到你在KC記住我
中配置的過期時間。
假設還有第2個、第3個應用,在keycloak的相同的realm中註冊了各自的client,我們在訪問第2個、第3個應用的時候,也會跳轉到keycloak登入頁面(帶上各自的client_id, redirect_url),但是就像上面的現象一樣,我們的keycloak登入頁對應的domain/path中有那3個cookie值AUTH_SESSION_ID,KEYCLOAK_IDENTITY和KEYCLOAK_SESSION, 這樣就會自動跳轉到我們應用的介面,無需填寫keycloak登入的賬號密碼,並且能夠返回授權碼code,這就算登入成功了,登入成功之後,後續的操作就是我們再利用這個授權碼code和client_secret訪問keycloak去獲取access token,這就是Oauth2.0的授權碼模式。
sesssion_state
以上三個被儲存在客戶端瀏覽器裡的鍵值( AUTH_SESSION_ID, KEYCLOAK_IDENTITY,KEYCLOAK_SESSION)都有對session_state的儲存,只不過,我們儲存的有效期不同,AUTH_SESSION_ID是會話級,後兩個是與KC後臺配置的記住我
中的refresh_token有效期相同的,即SSO Session Idle, SSO Session Max,Client Session Idle,Client Session Max四個配置,誰小使用誰。
- 當session_state達到這個refresh_token的超時時間+access_token超時時間後,它會被刪除
- 當使用者進行登出操作後,它會被刪除
- 如下配置,使用者在3+2分鐘後PM 02:22:17時,它的 會話將被刪除(回收)
在02:22:17 PM時,這個會話將被回收,同時這個使用者在前端也會從新去登入頁認證