class Google::Auth::DefaultCredentials

which type of credentials should be loaded.
DefaultCredentials is used to preload the credentials file, to determine

def self.determine_creds_class(json_key_io)

Reads the input json and determines which creds class to use.
def self.determine_creds_class(json_key_io)
  json_key = MultiJson.load json_key_io.read
  key = 'type'
  raise "the json is missing the '#{key}' field" unless json_key.key?(key)
  type = json_key[key]
  case type
  when 'service_account'
    [json_key, ServiceAccountCredentials]
  when 'authorized_user'
    [json_key, UserRefreshCredentials]
  else
    raise "credentials type '#{type}' is not supported"
  end
end

def self.make_creds(options = {})

loading the json.
override CredentialsLoader#make_creds to use the class determined by
def self.make_creds(options = {})
  json_key_io, scope = options.values_at(:json_key_io, :scope)
  if json_key_io
    json_key, clz = determine_creds_class(json_key_io)
    warn_if_cloud_sdk_credentials json_key['client_id']
    clz.make_creds(json_key_io: StringIO.new(MultiJson.dump(json_key)),
                   scope: scope)
  else
    warn_if_cloud_sdk_credentials ENV[CredentialsLoader::CLIENT_ID_VAR]
    clz = read_creds
    clz.make_creds(scope: scope)
  end
end

def self.read_creds

def self.read_creds
  env_var = CredentialsLoader::ACCOUNT_TYPE_VAR
  type = ENV[env_var]
  raise "#{env_var} is undefined in env" unless type
  case type
  when 'service_account'
    ServiceAccountCredentials
  when 'authorized_user'
    UserRefreshCredentials
  else
    raise "credentials type '#{type}' is not supported"
  end
end