keycloak~JWT沒有被持(chi)久化_是(shi)因為你(ni)對方法論理解(jie)不(bu)到位
JWT沒有被持久化?
- 我們總是說,JWT(json web token)是一個自解釋的token,里面有用戶相關的信息,它不需要被保存在服務端,降低了服務端的壓力;
- 同時有人會說,如果希望驗證token的實時在線性,你用JWT怎么實現?
- 有一些人直接會說,把這個JWT保存到redis里就行了,redis里有,它就是在線的...
- 事實上,這些聲音對
"在線性"的理解不夠透徹,在線性因為和瀏覽器會話有關,應該和session_id有關,而對于keycloak這個框架來說,它有自己的
session_id,它被稱為auth_session_id,它會存儲到客戶端cookie里,同時它也會放在認證服務器生產的JWT的payload里,在那里叫session_state - session_state就是一個UUID碼,它比jwt要小很多,所以認證服務器把它緩存起來,比起直接緩存JWT大串,壓力會小很多
jwt的在線線校驗設計

jwt權限刷新方式

keycloak封裝的token的核心屬性
- exp(Expiration Time) token過期時間戳
- iat(Issued At) token生成時間戳
- jti(jwt id,token_id) token的唯一身份標識,對接token_id或者refresh_token_id,這兩個id在服務端會有存儲,與它頒發的
token里的jti相對應 - iss(Issuer) token的發行機制,kc中的域,例如:
- aud(Audience) 授權到的客戶端,您在kc為用戶添加某些客戶端角色時,這個用戶的token將出現這些客戶端
- sub(Subject) 當前用戶ID
- typ(Type) 認證方式,例如Bearer
- azp 當前發起認證的客戶端client_id
- session_state 當前會話id,瀏覽器中的AUTH_SESSION_ID和AUTH_SESSION_ID_LEGACY
- acr 如果clientSession通過cookie (SSO)進行身份驗證,則使用0,否則為1
- allowed-origins 允許哪種域名使用我們的token
- realm_access 域的權限
- resource_access 客戶端(資源)權限,kc允許你為用戶依照客戶端去授權
- scope 客戶端模板,它將一類jwt中的屬性進行分類,通過這個scope模塊去渲染你的jwt字段