Как я могу протестировать API Google локально, используя Ruby в Rails? - PullRequest
0 голосов
/ 19 июня 2020

Я пытаюсь добавить группы в свой аккаунт Google Apps для бизнеса. Я создал учетную запись службы и дал ей роль администратора каталога служб. Теперь я хочу проверить это на моем локальном компьютере (я использую RubyMine для запуска через Rspe c). Тесты выглядят так:

require 'rails_helper'

describe GoogleApiHelper, type: :helper do
  it 'should authenticate successfully to Google' do
    google_auth_creds = OpenStruct.new authenticate(Api::Application.config.google[:auth][:scopes])
    expect(google_auth_creds).to_not be_nil
    expect(google_auth_creds.access_token).to match(/[A-Za-z\._-]*/)

    puts(google_auth_creds)
  end

  it 'should list all of the groups in the sinkingmoon.com domain' do
    groups = OpenStruct.new list_groups 'mydomain.com'

    puts(groups)
  end
end

Тестируемая реализация выглядит так:

require 'googleauth'
require 'google/apis/admin_directory_v1'

module GoogleApiHelper
  def authenticate(scopes)
    authorizer = Google::Auth::ServiceAccountCredentials.make_creds(
        json_key_io: File.open(Api::Application.config.google[:auth][:json_file]),
        scope: scopes)

    authorizer.fetch_access_token!
  end

  def retrieve_group(domain, groupId)
    authorizer = authenticate(Api::Application.config.google[:scopes])

    directory_service = Google::Apis::AdminDirectoryV1::DirectoryService.new
    directory_service.authorization = authorizer
    directory_service.get_group groupId
  end

  def list_groups(domain)
    authorizer = authenticate(Api::Application.config.google[:scopes])

    directory_service = Google::Apis::AdminDirectoryV1::DirectoryService.new
    directory_service.authorization = authorizer

    directory_service.list_groups(domain: domain)
  end
end

Тест на аутентификацию работает так, как я ожидал, в том смысле, что он дает мне токен авторизации и истечение срока. Однако тест на перечисление групп не проходит и появляется следующее сообщение:

Google::Apis::AuthorizationError: Unauthorized

  0) GoogleApiHelper should retrieve a group by the domain
     Failure/Error: directory_service.get_group groupId

     Google::Apis::AuthorizationError:
       Unauthorized

Я не совсем уверен, что делаю неправильно. Мои учетные данные хранятся в файле. json, а конфигурация настраивается в файле environment / test.rb:

  Api::Application.config.google = {
      :auth => {
          :json_file => 'config/auth/credentials.json',
          :scopes => [ 'https://www.googleapis.com/auth/admin.directory.group', 'https://www.googleapis.com/auth/admin.directory.domain' ]
      },
      :group => 'mygroup@mydomain.com'
  }

Мне интересно, возможно, я действительно неправильно настроил области для этой учетной записи службы. В качестве альтернативы, может быть, я пытаюсь получить доступ к API со своего локального компьютера, а не с моего сервера в зарегистрированном домене? В последнем случае, как я могу go протестировать это перед развертыванием в моем производственном или промежуточном веб-приложении?

Обновление Я распечатал области, которые использует приложение, которые являются: ["https://www.googleapis.com/auth/admin.directory.group", "https://www.googleapis.com/auth/admin.directory.domain"]. Я считаю, что это правильные. Я добавил их в консоль администратора в разделе «Безопасность» -> «Дополнительные настройки» -> «Управление клиентским доступом к API» и ввел имя моей учетной записи службы, которое выглядит примерно как test-account@myprojectname.iam.gserviceaccount.com, и указанные выше области. Это преобразуется в уникальный идентификатор учетной записи службы.

1 Ответ

0 голосов
/ 19 июня 2020

пробовали ли вы получить ответ от среды разработки? это то, что я использую, вы можете попробовать

require 'google/apis/analyticsreporting_v4'

AP = Google::Apis::AnalyticsreportingV4
credentials = Google::Auth::ServiceAccountCredentials.make_creds(json_key_io: IO.new(IO.sysopen('./config/credentials.json')))
credentials.scope = "https://www.googleapis.com/auth/analytics.readonly"
ga_reporting_service = AP::AnalyticsReportingService.new
ga_reporting_service.authorization = credentials.fetch_access_token!({})["access_token"]
...