code: public Result<Jwt> getJwt(Jwt.Key key) {
          Jwt cachedJwt = getJwt(cacheStrategy, key);
  
          Result<Jwt> result = OauthHelper.populateCCToken(cachedJwt);
          //update JWT
          if (result.isSuccess()) {
              cacheStrategy.cacheJwt(key, result.getResult());
          }
          return result;
      }
docs: get a Jwt with a provided Key (Key is either scope or a service id inputted by user, for caching usage):
  1.if a token is cached with provided key
  - if the token is expired, renew it right away.
  - if the token is almost expired, use this token and renew it silently.
  - if the token is not almost expired, just use this token.
  2.if a token is not cached with provided key
  - get a new jwt from oauth server
  3.after getting the valid token, cache that token no matter if it's already cached or not. The strategy should determine how to cache it.
  @param key either based on scope or service id
  @return a Jwt if successful, otherwise return error Status.