@Override
  protected boolean handleExceptionAndHintRetry(BlobStorageException blobStorageException) {
    // If the exception has status code 403, refresh the token and create a new storage client with the new token.
    if (blobStorageException.getStatusCode() == HttpStatus.SC_FORBIDDEN) {
      azureMetrics.absForbiddenExceptionCount.inc();
      synchronized (this) {
        // check if the access token has expired before refreshing the token. This is done to prevent multiple threads
        // to attempt token refresh at the same time. It is expected that as a result of token refresh, accessTokenRef
        // will updated with the new token.
        if (accessTokenRef.get().isExpired()) {
          refreshTokenAndStorageClients();
        }
      }
      return true;
    }
    return false;
  }
Create {@link IAuthenticationResult} using the app details.
@param azureCloudConfig {@link AzureCloudConfig} object.
@return {@link IAuthenticationResult} containing the access token.
@throws MalformedURLException
@throws InterruptedException
@throws ExecutionException
ambry-cloud/src/main/java/com/github/ambry/cloud/azure/ADAuthBasedStorageClient.java