Keycloak Java API AccessToken не обновляется - PullRequest
0 голосов
/ 21 января 2020

У меня есть приложение, которое печатает всех пользователей Keycloak. Я делаю это с помощью клиентского адаптера (в частности, JBoss EAP / WildFly Adapter). Для этого я написал класс обслуживания:

@Named
@SessionScoped
public class KeycloakService implements Serializable {

    final static String CLIENT_NAME_REALM_MANAGEMENT = "realm-management";

    @Inject
    SecurityContext securityContext;

    @Inject
    private KeycloakConfigLoader keycloakConfigLoader;

    private Keycloak keycloak;

    private KeycloakDeployment deployment;

    public KeycloakDeployment getDeployment() {
        if (deployment == null) {
            deployment = keycloakConfigLoader.getDeployment();
        }
        return deployment;
    }

    public Keycloak getKeycloak() {
        if (keycloak == null || keycloak.isClosed()) {
            keycloak = Keycloak.getInstance(
                    getDeployment().getAuthServerBaseUrl(),
                    getDeployment().getRealm(),
                    CLIENT_NAME_REALM_MANAGEMENT,
                    getKeycloakSecurityContext().getTokenString()
            );
        }

        return keycloak;
    }

    public RealmResource getRealmResource() {
        return getKeycloak().realm(getDeployment().getRealm());
    }

    public RolesResource getRealmRoles() {
        return getRealmResource().roles();
    }

    public UsersResource getUsersResource() {
        return getRealmResource().users();
    }

    public UserResource getUserResource(String id) {
        return getUsersResource().get(id);
    }

    public RefreshableKeycloakSecurityContext getKeycloakSecurityContext() {
        return (RefreshableKeycloakSecurityContext) ((KeycloakPrincipal) securityContext.getCallerPrincipal()).getKeycloakSecurityContext();
    }

}

Теперь у меня проблема в том, что токен доступа не обновляется автоматически sh через созданный объект Keycloak (getInstance) в конце токена доступа время жизни, и поэтому я получаю 401 ошибку. Это в принципе логично, поскольку срок действия токена истек.

Если я не "кэширую" (keycloak == null) экземпляр Keycloak в верхнем классе, все работает, потому что токен доступа SecurityContext всегда используется, и этот токен обновляется сам. Но это не является оптимальным с точки зрения производительности, поскольку экземпляр создается каждый раз.

Кто-нибудь знает, с чем это может быть связано, или как я могу дать экземпляру Keycloak новый токен доступа без нового инициализировать объект keycloak? Или я в основном неправильно использую Keycloak Adapter?

...