/**
   * Authenticate the request
   *
   * @param context
   * @param version
   * @param accessToken
   * @param requiredAuthenticationLevel
   * @param clientDomain
   * @return
   * @throws APIManagementException
   * @throws APIFaultException
   */
  public boolean doAuthenticate(
      String context,
      String version,
      String accessToken,
      String requiredAuthenticationLevel,
      String clientDomain)
      throws APIManagementException, APIFaultException {

    if (APIConstants.AUTH_NO_AUTHENTICATION.equals(requiredAuthenticationLevel)) {
      return true;
    }
    APITokenValidator tokenValidator = new APITokenValidator();
    apiKeyValidationDTO =
        tokenValidator.validateKey(
            context, version, accessToken, requiredAuthenticationLevel, clientDomain);
    if (apiKeyValidationDTO.isAuthorized()) {
      String userName = apiKeyValidationDTO.getEndUserName();
      PrivilegedCarbonContext.getThreadLocalCarbonContext()
          .setUsername(apiKeyValidationDTO.getEndUserName());
      try {
        PrivilegedCarbonContext.getThreadLocalCarbonContext()
            .setTenantId(IdentityUtil.getTenantIdOFUser(userName));
      } catch (IdentityException e) {
        log.error("Error while retrieving Tenant Id", e);
        return false;
      }
      return true;
    } else {
      throw new APIFaultException(
          apiKeyValidationDTO.getValidationStatus(),
          "Access failure for API: "
              + context
              + ", version: "
              + version
              + " with key: "
              + accessToken);
    }
  }