Google AdWords API, как авторизоваться с помощью олицетворения учетной записи службы - PullRequest
1 голос
/ 26 марта 2019

Я пытаюсь разработать скрипт ruby ​​для запроса API Google Adwords с использованием учетных данных учетной записи службы.Я знаю, что файл учетных данных json работает в другом сценарии, который не является ruby, но я не могу пройти авторизацию в этом сценарии ruby.Я не могу найти никаких примеров, используя этот шаблон.Я не хочу использовать OAuth2.Я знаю, что этот сценарий не очень хорошо разработан, но я просто пытаюсь получить основы.Что я здесь не так делаю?

У моей компании есть учетная запись G Suite, и у меня есть полные права администратора.

Вот мой код:

    #!/usr/bin/ruby

    require 'googleauth'
    require 'fileutils'
    require 'adwords_api'

    API_VERSION = :v201809

    scopes = ["https://www.googleapis.com/auth/adwords"]
    credential_file = File.open('credentials/adwords-production.json')
    prn = "adwords@mycompany.com"

    authorizer = Google::Auth::ServiceAccountCredentials.make_creds(json_key_io: credential_file, scope: scopes, prn: prn)

    def get_report_fields(report_type)

      adwords = AdwordsApi::Api.new

      report_def_srv = adwords.service(:ReportDefinitionService, API_VERSION)

      # Get report fields.
      fields = report_def_srv.get_report_fields(report_type)
      if fields
        puts "Report type '%s' contains the following fields:" % report_type
        fields.each do |field|
          puts ' - %s (%s)' % [field[:field_name], field[:field_type]]
          puts '  := [%s]' % field[:enum_values].join(', ') if field[:enum_values]
        end
      end
    end

    begin
        report_type = 'ACCOUNT_PERFORMANCE_REPORT'
        get_report_fields(report_type)
    end

1 Ответ

1 голос
/ 04 апреля 2019

Из документов Google здесь :

Все вызовы API AdWords должны быть авторизованы через OAuth2.OAuth2 позволяет клиентскому приложению AdWords API получать доступ к учетной записи Google Ads пользователя, не обрабатывая и не сохраняя информацию для входа в систему.

Похоже, вы должны использовать OAuth2 Аутентификация.

Дальнейшее чтение здесь подтверждает это:

Вашему приложению потребуется доступ к данным пользователя и связь с другими службами Google от вашего имени.Аутентификация через OAuth2 позволяет вашему приложению работать от имени вашей учетной записи.

Чтобы приложение могло получить доступ к API, вам необходим идентификатор клиента OAuth2 и секрет клиента.

Вы говорите, что сделали это где-то еще, где вы смогли использовать файл JSON, поэтому я немного посмотрел на источник.

Источник для Ruby API - здесь и здесь .Похоже, что на самом деле нет другого способа управления учетными данными, по крайней мере, в Ruby API.Смотрите здесь:

    # Retrieve correct soap_header_handler.
    #
    # Args:
    # - auth_handler: instance of an AdsCommon::Auth::BaseHandler subclass to
    #   handle authentication
    # - version: intended API version
    # - header_ns: header namespace
    # - default_ns: default namespace
    #
    # Returns:
    # - SOAP header handler
    #
    def soap_header_handler(auth_handler, version, header_ns, default_ns)
      auth_method = @config.read('authentication.method', :OAUTH2)
      handler_class = case auth_method
        when :OAUTH2, :OAUTH2_SERVICE_ACCOUNT
          AdsCommon::SavonHeaders::OAuthHeaderHandler
        else
          raise AdsCommon::Errors::AuthError,
              "Unknown auth method: %s" % auth_method
        end
      return handler_class.new(@credential_handler, auth_handler, header_ns,
                                  default_ns, version)
    end

Обратите внимание, что, если OAuth не используется, он выдает ошибку.Там действительно нет другого способа аутентификации.Даже если вам удалось пройти проверку подлинности другим способом и попытаться передать его менеджеру учетных данных, он отклонит его.

Краткий ответ: Это невозможно в Ruby API, если его не взломать.

...