Я использую appAuth с Keycloak для аутентификации в моем приложении android. Примерно через 25 минут срок действия маркера доступа истекает. Когда я пытаюсь обновить sh токен после этого периода, я получаю эту ошибку:
Failed to authorize = AuthorizationException: {"type":2,"code":2002,"error":"invalid_grant","errorDescription":"Refresh token expired","errorUri":""}
Чтобы обновить sh токен, я вызываю executeActionWithFreshTokens и передаю refreshToken, который я получил ранее от TokenResponse.
Map<String, String> refreshTokenAdditionalParams = new HashMap<>();
refreshTokenAdditionalParams.put(Constants.REFRESH_TOKEN,getAuthState().getRefreshToken());
Log.i(TAG, "Refresh Token from AuthState:"+ getAuthState().getRefreshToken());
mAuthStateManager.getCurrent().performActionWithFreshTokens(mAuthService,clientAuthentication,refreshTokenAdditionalParams, (accessToken, idToken, ex) -> {
Log.i(TAG, "Access Token :"+ accessToken + "id Token :"+ idToken );
Log.i(TAG, "Token Response :"+ mAuthStateManager.getCurrent().getLastTokenResponse());
if (ex != null) {
// negotiation for fresh tokens failed, check ex for more details
if (ex.errorDescription.contains(Constants.TOKEN_EXPIRED)) {
CommonHelper.getAccessDeniedFailure(false);
return;
}
}
mAuthStateManager.getCurrent().update(mAuthStateManager.getCurrent().getLastTokenResponse(), ex);
if (getAuthState().isAuthorized()) {
SessionManager.UserDetail detail = sessionManager.getUserDetails();
if (detail == null) {
detail = new SessionManager.UserDetail();
}
detail.updateAuthToken(getAuthState().getAccessToken());
detail.updateRefreshToken(getAuthState().getRefreshToken());
sessionManager.createUserSession(detail);
sessionManager.setLastActivityTime(System.currentTimeMillis());
}
callback.onTokenRequestCompleted(mAuthStateManager.getCurrent().getLastTokenResponse(), ex);
});
Прежде чем решить передать функцию refreshToken в качестве дополнительных параметров в функции, я подумал, что тот факт, что я вызываю executeActionWithFreshTokens, автоматически разрешит это исключение. Я все еще получил ошибку. Затем я решил передать в качестве параметра refreshToken, но все равно получаю исключение, а возвращенные accessToken и idToken равны нулю.
Я не уверен, как еще решить эту проблему. Кто-нибудь еще сталкивался с этой проблемой? Спасибо.