Как реализовать межсерверную связь с помощью 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
в этом случае. Шаги для подражания:
- Зайдите в свой сервисный аккаунт.
- Дайте разрешение пользователю, которого вы хотите выдать себя за другого.
Нам нужно изменить наш код для этой настройки, как показано ниже
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'