keycloak域中tokens的配置
keycloak域中tokens的配置
一?認(rèn)證響應(yīng)體
{
????"access_token":?"xxx",
????"expires_in":?180,
????"refresh_expires_in":?180,
????"refresh_token":?"xxx",
????"token_type":?"Bearer",
????"not-before-policy":?1670293935,
????"session_state":?"28c2220c-0908-41d4-bb57-c1014d03ed2e",
????"scope":?"roles?my-application-scope?extension-roles?email?profile"
}
?
二?JWT數(shù)據(jù)載體
keycloak的Access_token(上面返回的)是JWT的,它的PAYLOAD數(shù)據(jù)載體主要包括用戶ID,用戶名,用戶角色,過期時間等信息,下面具體介紹:
Sub:用戶ID
preferred_username:賬號名稱
Name:用戶姓名
Email:電子郵件
realm_access:領(lǐng)域角色
resource_access:客戶端(資源服務(wù))角色
Azp:授權(quán)客戶端
Typ:token的類型
Aud:被授權(quán)的客戶端列表
Exp:token的過期時間
Iat:token建立的時間
Iss:?當(dāng)前領(lǐng)域的開放API,token頒發(fā)的機構(gòu),例如https://cas.pkulaw.com/auth/realms/fabao,只有來自這個域名的請求,才能使用咱們的token
三?tokens配置
選擇域realms設(shè)置-tokens標(biāo)簽;新版本叫sessions
14.0.0截圖
?

19.0.0截圖

下面對每一項進行說明:
1.?收回?Refresh?Token(Revoke?Refresh?Token):如果開啟?refresh?tokens只能使用一次,否則refresh?token不會被收回并且可以使用多次。
2.?SSO會話空閑時間(SSO?Session?Idle):設(shè)置會話在過期之前可以空閑的時間長度,當(dāng)會話過期時?Token?和瀏覽器會話都會被設(shè)置為無效。
3.?SSO會話最長時間(SSO?Session?Max):refresh_token的有效期一般比access_token的長,這也就是通過refresh_token來換取新的access_token的一個前提,下面來配置一個這兩個token的超時時間;refresh_token超時時間refresh_expires_in通過配置SSO?Session?Max進行設(shè)置。
4.?SSO?Session?Idle?Remember?Me:記住密碼空閑時間
5.?SSO?Session?Max?Remember?Me:記住密碼最大超時時間
6.?離線會話的空閑時間(Offline?Session?Idle):離線會話允許的空閑時間。你需要使用離線Token在這段時間內(nèi)至少刷新一次否則會話就會過期,對接角色offline_access。
7.?Offline?Session?Max?Limited:開啟離線token的不受限制
8.?Client?Session?Idle:客戶端token空閑時間
9.?Client?Session?Max【不知道它的實際作用】:客戶端token的最大超時時間,在生成的JWT中指向expires_in,而客戶端的refresh_expires_in永遠(yuǎn)是0,即永不過期,不過在測試?keycloak過程中發(fā)現(xiàn),通過client_credentials的方式獲取的access_token,它的有效期也是由Access?Token?Lifespan來控制的,就是說和其它認(rèn)證獲取的token有效期是一樣的。
10.?Access?Token?Lifespan:token的超時時間
11.?隱式認(rèn)證token超時時間(Access?Token?Lifespan?For?Implicit?Flow):Max?time?before?an?access?token?issued?during?OpenID?Connect?Implicit?Flow?is?expired.?This?value?is?recommended?to?be?shorter?than?SSO?timeout.?There?is?no?possibility?to?refresh?token?during?implicit?flow,?that's?why?there?is?a?separate?timeout?different?to?'Access?Token?Lifespan'.
12.?Client?login?timeout:客戶端登錄過程中超時時間
13.?Login?timeout:登出的超時時間
?
四?refresh_token和access_token有效期配置
refresh_token的有效期一般比access_token的長,這也就是通過refresh_token來換取新的access_token的一個前提,下面來配置一個這兩個token的超時時間。
refresh_token超時時間refresh_expires_in,在realms?settings中,選擇tokens進行配置,對SSO?Session?Max進行設(shè)置
?

access_token超時時間expires_in,在realms?settings中,選擇tokens進行配置,對Access?Token?Lifespan進行設(shè)置。

這個用戶會話,對應(yīng)的sessionId(session_state)可以在瀏覽器cookie中找到,或者在kc管理后臺的用戶-》會話中查看,這個sessionId被客戶端訪問,都會刷新這個“最后訪問”時間,如圖
?

當(dāng)access_token時間到期后,用戶在瀏覽器訪問時,會出現(xiàn)會話過期,并且在kc管理后臺會看到用戶-》會話中的那邊會話被刪除。
?

如果用戶訪問資源,在token過期,而refresh_token(sso?session?max)未過期時,你可以通過refresh_token來獲取新的token,這時會有新的會話產(chǎn)生;但如果refresh_token也過程時,它將跳轉(zhuǎn)到登錄頁,從新進行認(rèn)證。
五?refresh_token永久性
對于用戶登錄后,如果授權(quán)碼模式,如果希望refresh_token永不過期,可以使用offline_access這種scope?,前提是需要為用戶添加這個offline_access角色。
?

生成的refresh_token的超時時間將是0,即永不超時。
六?客戶端認(rèn)證
客戶端認(rèn)證client_credentials,獲取的token中沒有refresh_token,但出現(xiàn)了refresh_token的過期時間為0,它表示永不過期,或者對refresh_token無效。
沒有refresh_token的解釋:當(dāng)使用客戶端憑據(jù)授權(quán)時,客戶端應(yīng)用程序使用其客戶端?ID?和客戶端密碼向授權(quán)服務(wù)器進行身份驗證.如果獲得授權(quán),它會取回資源的訪問令牌.在這種情況下沒有用戶交互,因此不需要發(fā)出刷新令牌.
當(dāng)訪問令牌過期時,客戶端可以使用自己的憑據(jù)來請求新令牌.當(dāng)客戶端想要代表用戶訪問資源(當(dāng)時可能沒有與客戶端交互)時,使用刷新令牌.
?


七?接口鑒權(quán)
權(quán)限校驗方法:Org.keycloak.phone.utils.TokenUtils.requireRole方法
?

八?認(rèn)證失敗解析
1.?客戶端失敗
?

2.?密碼認(rèn)證失敗

3.?授權(quán)碼失敗

相關(guān)文檔參考
https://www.rfc-editor.org/rfc/rfc6749