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