keycloak~Refresh_token階段不走RequiredAction

张占岭發表於2024-09-03

Refresh_token是在access_token過期之後,用來換新的access_token的,有了Refresh_token之後,使用者可以在很長一段時間不需要重新登入,這對於使用者體驗是有好處的;RequiredAction是一種登入階段的必選行為,當一個使用者被某個RequiredAction標記之後,使用者必須完成RequiredAction,才算完成本次登入。

Refresh_token階段是否會檢查RequiredAction

這個答案是否定的,當一個使用者登入之後,它在後臺被標記一個RequiredAction,對於已經產生的refresh_token是不會有影響的,你拿著refresh_token還是可以直接換新的access_token。

當使用者被禁用了,Refresh_token是否會被就叫影響

這個答案是肯定的,當一個使用者的enable為false時,使用者所產生的refresh_token就無法換回新的token了,這時會有http_status為400的錯誤返回

{
    "error": "invalid_grant",
    "error_description": "User disabled"
}

從keycloak原始碼中也是可以看到的,位於org.keycloak.protocol.oidc.endpoints.TokenEndpoint型別的refreshTokenGrant()方法,有判斷使用者是否有效的方法,在`tokenManager.refreshAccessToken()方法中,如圖

從內部方法可以找到判斷使用者狀態的程式碼,如下

if (!user.isEnabled()) {
  throw new OAuthErrorException(OAuthErrorException.INVALID_GRANT, "User disabled", "User disabled");
}

如果希望refresh_token階段對使用者的required action有所控制,可以在這裡新增對應的邏輯即可。

相關文章