Keycloak會話管理中,獲取到accessToken和refreshToken後,基於accessToken交換用戶數據或者參與KeycloakAPI的請求,當accessToken過時的時候,可以使用refreshToken去交換新的accessToken和refreshToken。html
咱們可能會遇到這樣一個狀況:當refreshToken在請求的時候也過時了,這個時候,須要回到登陸頁面。若是按照這樣的流程走,將帶來較差的體驗,須要用戶從新登陸,尤爲在較多模塊中,這種方案極不可取。session
咱們先從正常的角度去請求token、基於refreshToken交換token、基於offlineToken交換tokenapp
基於Oauth2-password獲取token
curl -X POST -H "Content-Type: application/x-www-form-urlencoded" -d 'grant_type=password&client_id=ROOMIS&username=123&password=123' "http://keycloak域名IP/auth/realms/{realms名字}/protocol/openid-connect/token" | jq
基於refreshToken獲取accessToken和refreshToken curl -X POST -H "Content-Type: application/x-www-form-urlencoded" -d 'grant_type=refresh_token&client_id=ROOMIS&refresh_token={refreshToken}' "http://keycloak域名IP/auth/realms/{realms名字}/protocol/openid-connect/token" | jq
請求後的結果如上圖所示。curl
備註
1 基於上述獲取的refreshToken是有失效期的,當剛恰好refreshToken失效的時候,將再也不獲取accessToken,只能從新登陸。 2 官方的解決辦法是獲取離線token,請參照:https://www.keycloak.org/docs/3.2/server_admin/topics/sessions/offline.html
解決方法是:在請求token的時候,假如scope=offline_accessurl