2017-02-27 34 views
0

我有一個Rails應用程序,我想用Gmail API發送電子郵件(紅寶石using google-api-client)。我在Google開發者中創建了一個應用程序,並且生成了一個服務帳戶密鑰。我使用谷歌規範來存儲憑據JSON文件(存儲在/home/user/.config/gcloud/applicaton_default_credentials.json)。如何在ruby中使用google api實現服務器到服務器的通信?

對於初學者來說,我想取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配置中。

回答

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 = '[email protected]' 
    user_id = 'me' 
    result = auth_client.list_user_labels(user_id) 
    

注:對於這一點,工作,我們需要去我們的G-西裝帳戶和我們的服務給予適當的權限帳戶。

0

記住服務帳戶不是你。服務帳戶是擁有Google雲端硬盤帳戶和Google日曆帳戶的虛擬用戶,可能還有其他幾個帳戶。但它沒有Gmail帳戶。

USER_ID = '我'

不會與服務帳戶工作。

注意:您不能使用具有正常gmail用戶帳戶的服務帳戶。

如果這是一個域帳戶的用戶,那麼你可以採取服務帳戶的電子郵件地址,並添加爲您的域管理員帳戶的用戶。授予其訪問用戶Gmail帳戶的權限。然後,你需要做的是這樣

USER_ID =「用戶名@域」