Как реализовать межсерверную связь с помощью google api в ruby?

У меня есть приложение rails, в котором я хотел отправлять электронную почту с помощью Gmail API(using google-api-client для рубина). Я создал одно приложение для разработчиков Google и сгенерировал ключ учетной записи службы. Я использую спецификации Google для хранения этого файла JSON учетных данных (хранение в /home/user/.config/gcloud/applicaton_default_credentials.json).

Для начала я хотел получить user labels ниже мой код

require 'google/apis/gmail_v1'
gmail_v1 = Google::Apis::GmailV1
service = gmail_v1::GmailService.new
service.authorization = Google::Auth.get_application_default([gmail_v1::AUTH_SCOPE, gmail_v1::AUTH_GMAIL_COMPOSE, gmail_v1::AUTH_GMAIL_MODIFY, gmail_v1::AUTH_GMAIL_READONLY])
user_id = 'me'
result = service.list_user_labels(user_id)

Но это дает мне Google::Apis::ClientError: failedPrecondition: Bad Request ошибка.

Моей конечной целью является отправка электронной почты с использованием электронной почты, для которой я сгенерировал JSON-файл с учетными данными, поскольку я не хочу указывать свое имя пользователя и пароль в конфигурации smtp ActionMailer.

2 ответа

Решение

После многих часов отладки я наконец нашел рабочее решение. DalmTo прав в том, что служебная учетная запись не может получить доступ к Gmail, поскольку для Gmail требуется учетная запись пользователя, но мы можем использовать возможности impersonation в этом случае. Шаги для подражания:

  1. Зайдите в свой сервисный аккаунт.
  2. Дайте разрешение пользователю, которого вы хотите выдать себя за другого.
  3. Нам нужно изменить наш код для этой настройки, как показано ниже

    service = gmail_v1::GmailService.new
    service.authorization = Google::Auth.get_application_default([gmail_v1::AUTH_SCOPE,    gmail_v1::AUTH_GMAIL_COMPOSE, gmail_v1::AUTH_GMAIL_MODIFY, gmail_v1::AUTH_GMAIL_READONLY])
    auth_client = service.authorization.dup
    auth_client.sub = 'user@domain'
    user_id = 'me'
    result = auth_client.list_user_labels(user_id)
    

Примечание. Чтобы это работало, нам нужно зайти в нашу учетную запись G-suit и дать соответствующее разрешение нашей учетной записи службы.

Помните, что учетные записи службы это не ВЫ. Учетная запись службы - это фиктивный пользователь, у которого есть учетная запись Google Drive и учетная запись Google Calendar и, возможно, еще несколько. Однако у него нет учетной записи Gmail.

user_id = 'я'

Не будет работать с учетной записью сервиса.

Примечание. Нельзя использовать служебные учетные записи с обычными учетными записями пользователей Gmail.

Если это пользователь учетной записи домена, то вы можете взять адрес электронной почты учетной записи службы и добавить его в качестве пользователя в свою учетную запись администратора домена. Предоставление ему разрешения на доступ к учетным записям пользователей Gmail. Тогда вам нужно будет сделать что-то вроде

user_id = 'user@domain'

Другие вопросы по тегам