private Future<JwkResult> getJwk(String kid) {
        /* The result of vertx.executeBlocking is a future that contains Vert.x context which is valid during a request
         * execution. So, if we put that future in a cache, it will contain a context from the initial request, that
         * may be invalid for further requests. For this reason, when we retrieve the future from the cache, we must
         * extract the value and put it into another future (Promise) which holds a valid context of a current request.
         * */
        Promise<JwkResult> promise = Promise.promise();
        cache.computeIfAbsent(kid, key -> vertx.executeBlocking(() -> {
            JwkResult jwkResult;
            long currentTime = System.currentTimeMillis();
            try {
                Jwk jwk = jwkProvider.get(key);
                jwkResult = new JwkResult(jwk, null, currentTime + positiveCacheExpirationMs);
            } catch (Exception e) {
                jwkResult = new JwkResult(null, e, currentTime + negativeCacheExpirationMs);
            }
            return jwkResult;
        }, false)).onSuccess(promise::complete).onFailure(promise::fail);
        return promise.future();
    }
The path to the claim to extract user display name
server/src/main/java/com/epam/aidial/core/server/security/IdentityProvider.java