docs: @Override
      public OAuth2AccessToken readAccessToken(String accessToken) {
          TokenValidation tokenValidation =
                  tokenValidationService.validateToken(accessToken, true).checkJti();
  
          Map<String, Object> claims = tokenValidation.getClaims();
          accessToken = tokenValidation.getJwt().getEncoded();
  
          // Expiry is verified by check_token
          CompositeToken token = new CompositeToken(accessToken);
          token.setTokenType(OAuth2AccessToken.BEARER_TYPE);
          token.setExpiration(new Date(Long.valueOf(claims.get(EXP).toString()) * 1000L));
  
          @SuppressWarnings("unchecked")
          ArrayList<String> scopes = (ArrayList<String>) claims.get(SCOPE);
          if (null != scopes && scopes.size() > 0) {
              token.setScope(new HashSet<>(scopes));
          }
          String clientId = (String)claims.get(CID);
          String userId = (String)claims.get(USER_ID);
          BaseClientDetails client = (BaseClientDetails) clientDetailsService.loadClientByClientId(clientId, IdentityZoneHolder.get().getId());
          // Only check user access tokens
          if (null != userId) {
              @SuppressWarnings("unchecked")
              ArrayList<String> tokenScopes = (ArrayList<String>) claims.get(SCOPE);
              approvalService.ensureRequiredApprovals(userId, tokenScopes, (String) claims.get(GRANT_TYPE), client);
          }
  
          return token;
      }