keycloak~Refresh_token階段(duan)不走(zou)RequiredAction
Refresh_token是在access_token過期(qi)之后(hou),用來(lai)換(huan)新(xin)的access_token的,有(you)了Refresh_token之后(hou),用戶(hu)可(ke)以在很長(chang)一(yi)段時間不需要重新(xin)登錄(lu),這對于用戶(hu)體驗是有(you)好處的;RequiredAction是一(yi)種登錄(lu)階(jie)段的必選行為,當一(yi)個(ge)用戶(hu)被某個(ge)RequiredAction標記(ji)之后(hou),用戶(hu)必須(xu)完成(cheng)RequiredAction,才算完成(cheng)本次登錄(lu)。
Refresh_token階段是否會檢查RequiredAction
這個(ge)(ge)答案是否定的(de)(de),當一(yi)個(ge)(ge)用戶登錄之后,它在后臺(tai)被標記一(yi)個(ge)(ge)RequiredAction,對(dui)于(yu)已經(jing)產生的(de)(de)refresh_token是不會有影響的(de)(de),你拿著refresh_token還是可以直接換新的(de)(de)access_token。

當用戶被禁用了,Refresh_token是否會被就叫影響
這個答(da)案是肯(ken)定的(de),當一個用戶的(de)enable為false時,用戶所產生的(de)refresh_token就(jiu)無法(fa)換回(hui)新的(de)token了,這時會有http_status為400的(de)錯誤返(fan)回(hui)
{
"error": "invalid_grant",
"error_description": "User disabled"
}
從keycloak源代碼中也是可以看到的,位于org.keycloak.protocol.oidc.endpoints.TokenEndpoint類型的(de)refreshTokenGrant()方法(fa),有(you)判(pan)斷用戶是否有(you)效的(de)方法(fa),在`tokenManager.refreshAccessToken()方法(fa)中,如圖

從內部方法可以(yi)找到判斷用戶狀態的代碼,如下
if (!user.isEnabled()) {
throw new OAuthErrorException(OAuthErrorException.INVALID_GRANT, "User disabled", "User disabled");
}
如果希望refresh_token階(jie)段對(dui)(dui)用戶的required action有所控制,可(ke)(ke)以在這里(li)添加對(dui)(dui)應的邏輯即(ji)可(ke)(ke)。