class_docstr: Centralized config for handling configuration loading/parsing
class_docstr_tok: ["Centralized","config","for","handling","configuration","loading\/parsing"]
docstr: Validate the authentication dictionary retrieved from AWS Parameter Store
  
  Args:
      required_keys (set): required authentication keys for the running app
  
  Returns:
      bool: ndicator of successful validation
docstr_tok: ["Validate","the","authentication","dictionary","retrieved","from","AWS","Parameter","Store","Args",":","required_keys","(","set",")",":","required","authentication","keys","for","the","running","app","Returns",":","bool",":","ndicator","of","successful","validation"]
code: def validate_auth(self, required_keys):
      """Validate the authentication dictionary retrieved from AWS Parameter Store
  
      Args:
          required_keys (set): required authentication keys for the running app
  
      Returns:
          bool: ndicator of successful validation
      """
      # The config validates that the 'auth' dict was loaded, but do a safety check here
      if not self.auth:
          raise AppAuthError("[{}] Auth config is empty".format(self))
  
      auth_key_diff = required_keys.difference(set(self.auth))
      if not auth_key_diff:
          return True
  
      missing_auth_keys = ", ".join(
          "'{}'".format(key) for key in auth_key_diff
      )
      raise AppAuthError(
          "[{}] Auth config is missing the following "
          "required keys: {}".format(self, missing_auth_keys)
      )
  
imports: import calendar
  from datetime import datetime
  import json
  import re
  import time
  import backoff
  import boto3
  from botocore import client
  from botocore.exceptions import ClientError
  from streamalert.apps.exceptions import AppAuthError, AppConfigError, AppStateError
  from streamalert.shared.logger import get_logger
label_desc: Use image node_id 13 for calling the AppConfig obj's underlying member method code with example usage: obj.validate_auth(required_keys) and returns: True