Связь между серверами Google API не работает (реализация Ruby) - PullRequest
0 голосов
/ 12 марта 2019

Я выполнил все шаги по настройке делегирования полномочий для всего домена (https://developers.google.com/admin-sdk/reports/v1/guides/delegation) и следовал по этой ссылке тоже (https://developers.google.com/identity/protocols/OAuth2ServiceAccount#delegatingauthority)), и в итоге я создал этот класс в Ruby.

class Gsuite::ServiceAccount

def initialize(person: nil)
end 

def authorized_client
      Google::Auth::ServiceAccountCredentials.make_creds(
    authorizer = Google::Auth::ServiceAccountCredentials.make_creds(
      json_key_io: StringIO.new(File.read AppConfig[:gsuite_service_account] 
 [:credentials_file]),
      scope: AppConfig[:gsuite_service_account][:scope])
    client = authorizer.fetch_access_token!
  end
end

Этот класс возвращает мне этот хэш

{"access_token"=>"a_long_token_string_here", "expires_in"=>3600, "token_type"=>"Bearer"}

Затем я создал этот метод (в своем классе Admin) для подключения к службе Gmail

def gsuite_client_access
    @client ||= Gsuite::ServiceAccount.new(person: self.email.to_s).authorized_client
    authorized_client = Google::Apis::GmailV1::GmailService.new
    authorized_client.authorization = @client
    authorized_client
  end

Поэтому, когда я пытаюсь перечислить свои сообщения Gmail с этой строкой в ​​другой части кода

inbox = current_admin.gsuite_client_access.list_user_messages('me', max_results: 10)

, я получаю следующее сообщение об ошибке =>

Sending HTTP get https://www.googleapis.com/gmail/v1/users/me/messages?maxResults=10
401
#<Hurley::Response GET https://www.googleapis.com/gmail/v1/users/me/messages?maxResults=10 == 401 (238 bytes) 645ms>
Caught error Unauthorized
Error - #<Google::Apis::AuthorizationError: Unauthorized>

Retrying after authentication failure
Google::Apis::AuthorizationError: Unauthorized

Любые идеи, которых здесь не хватает

1 Ответ

0 голосов
/ 13 марта 2019

Наконец-то я все заработал. Оказывается, вам нужно использовать эту строку, чтобы использовать метод sub для «олицетворенного пользователя», чтобы иметь возможность подключиться.

authorizer.sub = @person

И, для вашего удовольствия, вот обновленный тестовый код для чтения сообщений Gmail, так что вы можете следить за ним, если захотите его использовать. Просто не забудьте сохранить файл credentials.json в папке вашего проекта, чтобы он работал, и использовать ту же область, которую вы добавили в GSuite Dashboard.

class Gsuite::ServiceAccount

  def initialize(person: nil)
    @person = person
  end

  def read_messages
    client = service_account_access
    inbox = client.list_user_messages(@person, max_results: 5, label_ids: "INBOX" )
    if inbox.result_size_estimate.nonzero?
      inbox.messages.each do |message|
        response = client.get_user_message(@person, message.id)
      end
    end
  end

private

  def service_account_access
    token = authorized_client
    client = Signet::OAuth2::Client.new(access_token: token['access_token'])
    client.expires_in = Time.current + token["expires_in"]
    auth_client = Google::Apis::GmailV1::GmailService.new
    auth_client.authorization = client
    auth_client
  end

  def authorized_client
    authorizer = Google::Auth::ServiceAccountCredentials.make_creds(
      json_key_io: StringIO.new(File.read AppConfig[:credentials_file]),
      scope: AppConfig[:gsuite_scope]).dup
    authorizer.sub = @person
    authorizer.fetch_access_token!
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...