Google adwords api как авторизоваться с помощью олицетворения учетной записи сервиса

#ruby #google-ads-api

#ruby #google-ads-api

Вопрос:

Я пытаюсь разработать скрипт 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. кажется, вы объявляете authorizer , но никогда не используете.

Ответ №1:

Из документов 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 без его какого-либо взлома.