### Description

Currently, the [`tryAuthenticateToken`](https://github.com/elastic/elasticsearch/blob/55088d154d1764a6d4fa8e9078bde9da1e9ff9a5/x-pack/plugin/security/src/main/java/org/elasticsearch/xpack/security/authc/TokenService.java#L458) method calls `decodeAndValidateToken` which ends up sending two `GetRequest` for the same token ID. First in [`decodeToken`](https://github.com/elastic/elasticsearch/blob/55088d154d1764a6d4fa8e9078bde9da1e9ff9a5/x-pack/plugin/security/src/main/java/org/elasticsearch/xpack/security/authc/TokenService.java#L602) and second in [`checkIfTokenIsValid`](https://github.com/elastic/elasticsearch/blob/55088d154d1764a6d4fa8e9078bde9da1e9ff9a5/x-pack/plugin/security/src/main/java/org/elasticsearch/xpack/security/authc/TokenService.java#L1977). The second call is unnecessary as we already fetched the access token in the first call, it's just simply dropped. We should refactor these two methods to avoid sending second get request just to validate the access token.
x-pack/plugin/security/src/main/java/org/elasticsearch/xpack/security/authc/TokenService.java
(SearchHit hit) -> filterAndParseHit(hit, isOfUser(username))
                    );
                }
            }
        }, listener::onFailure));
    }
    /**
     * Security tokens were traditionally stored on the main security index but after version {@code #VERSION_TOKENS_INDEX_INTRODUCED} they
     * have been stored on a dedicated separate index. This move has been implemented without requiring user intervention, so the newly
     * created tokens started to be created in the new index, while the old tokens were still usable out of the main security index, subject
     * to their maximum lifetime of {@code ExpiredTokenRemover#MAXIMUM_TOKEN_LIFETIME_HOURS} hours. Once the dedicated tokens index has been
     * automatically created, all the onwards created tokens will be stored inside it. This function returns the list of the indices names
     * that might contain tokens. Unless there are availability or version issues, the dedicated tokens index always contains tokens. The
     * main security index <i>might</i> contain tokens if the tokens index has not been created yet, or if it has been created recently so
     * that there might still be tokens that have not yet exceeded their maximum lifetime.
     */
    private void sourceIndicesWithTokensAndRun(ActionListener<List<String>> listener) {
        final List<String> indicesWithTokens = new ArrayList<>(2);
        final SecurityIndexManager frozenTokensIndex = securityTokensIndex.freeze();
        if (frozenTokensIndex.indexExists()) {
            
            if (false == frozenTokensIndex.isAvailable()) {
                listener.onFailure(frozenTokensIndex.getUnavailableReason());
                return;
            }
            if (false == frozenTokensIndex.isIndexUpToDate()) {
                listener.onFailure(
                    new IllegalStateException(
                        "Index ["
                            + frozenTokensIndex.aliasName()