如何在ruby中使用googleapi实现服务器到服务器的通信?

How to implement server to server communication using google api in ruby?

我有一个 rails 应用程序,我想在其中使用 Gmail API(using google-api-client for ruby)发送电子邮件。我在 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 文件的电子邮件发送电子邮件,因为我不想将我的用户名和密码放在 ActionMailer 的 smtp 配置中。

记住服务帐户不是您。服务帐户是一个虚拟用户,拥有 Google 驱动器帐户和 google 日历帐户,可能还有更多。但是它没有 gmail 帐户。

user_id = 'me'

不适用于服务帐户。

注意:您不能将服务帐户与普通的 gmail 用户帐户一起使用。

如果这是域帐户用户,那么您可以获取服务帐户电子邮件地址并将其添加为域管理员帐户的用户。授予它访问用户 gmail 帐户的权限。然后你需要做一些像

user_id = 'user@domain'

经过几个小时的调试,我终于找到了一个可行的解决方案。 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 帐户并为我们的服务帐户授予适当的权限。