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

时间:2017-02-27 13:25:02

标签: ruby-on-rails ruby google-api gmail service-accounts

我有一个rails应用程序,我想在其中使用Gmail API发送电子邮件(using google-api-client用于ruby)。我在谷歌开发者中创建了一个应用程序,并且我已经生成了一个服务帐户密钥。我使用谷歌规范存储该凭证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配置中。

2 个答案:

答案 0 :(得分:0)

记住服务帐户不是您。服务帐户是虚拟用户,拥有Google云端硬盘帐户和Google日历帐户,可能还有一些帐户。但它没有Gmail帐户。

  

user_id =' me'

无法使用服务帐户。

注意:您无法使用具有普通Gmail帐户的服务帐户。

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

这样的事情
  

user_id =' user @ domain'

答案 1 :(得分:0)

经过几个小时的调试,我终于找到了一个有效的解决方案。 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)
    
  4. 注意:为此,为了工作,我们需要访问我们的G-suit帐户,并为我们的服务帐户提供适当的许可。