2016-03-01 47 views
0

我正在嘗試創建一個Web應用程序,它從我的Google日曆帳戶獲取數據並將其放在使用其自己的日曆程序的網站上。我不希望每次運行該程序都必須獲得用戶對該帳戶的許可,因爲我是該帳戶的用戶,並且根據https://developers.google.com/api-client-library/ruby/auth/service-accountshttps://developers.google.com/identity/protocols/OAuth2,似乎唯一的方法是執行此操作使用服務帳戶。這是我的方案的理想選擇嗎?無論如何,我設置了一個服務帳戶,生成與我的憑據JSON文件,並試圖創建一個能返回我的日曆ID的列表,以便我可以訪問所有我的日曆代碼:如何使用Ruby的Google Calendar API客戶端庫爲我的帳戶獲取日曆ID列表?

require 'google/apis/calendar_v3' 
require 'googleauth' 
require 'oauth' 

cert_path = Gem.loaded_specs['google-api-client'].full_gem_path+'/lib/cacerts.pem' 
ENV['SSL_CERT_FILE'] = cert_path 

ENV['GOOGLE_APPLICATION_CREDENTIALS'] = 'C:\Users\eric\Desktop\Tripleseat Project\My Project-6006a5b60113.json' 

def createServiceObject() 
    service = Google::Apis::CalendarV3::CalendarService.new 
    scope = ["https://www.googleapis.com/auth/calendar"] 
    service.authorization = Google::Auth.get_application_default(scope) 
    service.authorization.fetch_access_token! 
    return service 
end 

service = createServiceObject() 
response = service.list_calendar_lists() 
puts response 
puts response.items 

當我從命令提示符運行它時,此代碼不會遇到任何錯誤,並且我得到了API的響應。但是,儘管我的Google日曆帳戶在屏幕左側的「我的日曆」菜單下清楚地列出了多個日曆,但每個日曆都有多個與之關聯的事件,但response.items字段始終爲空。我猜測問題是我的服務帳戶沒有正確地與我的谷歌日曆帳戶相關聯。但是,我找不到任何說明如何將服務帳戶與單個Google帳戶相關聯的文檔。有大量關於如何使用Google Apps Domain,Google App Engine或Google Compute Engine訪問多個用戶的帳戶的信息,但我不想將這些內容用於相對簡單的Ruby程序(我甚至沒有使用Rails或Sinatra)。我寧願將程序託管在Heroku服務器上,在那裏我已經設置了其他類似的程序。 API響應變爲空白還有其他原因嗎?如果API不知道從哪個帳戶獲取數據,它甚至應該返回任何東西?

+0

我看到您正在將您的應用憑據存儲在環境變量「GOOGLE_APPLICATION_CREDENTIALS」中,但您在請求訪問令牌時並未在授權階段的任何地方使用它,爲什麼呢? – sghosh968

+0

根據我的理解,如果您使用服務帳戶,則從該帳戶獲取日曆項目,而不是您的帳戶。請記住,服務帳戶是服務器到服務器的交互,其中帳戶屬於應用程序而不是用戶。 – adjuremods

+0

@ sghosh968:get_application_default是屬於Google應用程序默認憑證的一種方法,其文檔說明「環境變量GOOGLE_APPLICATION_CREDENTIALS已被選中,如果指定了該變量,它應該指向定義憑證的文件 –

回答

0

我想通了,我的問題是。我需要去我的谷歌日曆帳戶,並更改日曆的設置,以便它可以授權與我的服務帳戶共享其信息。我必須點擊谷歌日曆頁面右上角的齒輪圖標,轉到設置,轉到日曆,單擊共享:編輯設置,輸入我的服務帳戶的電子郵件地址,並將權限設置設置爲一下拉菜單上的make changes選項。

0

您不應該使用服務帳戶。您應該可以使用oauth2讓用戶授權您的服務來讀取和管理日曆,然後保存訪問令牌和刷新令牌。

+0

這個問題是我需要授權日曆的用戶。每當我想要在網頁上點擊是時,它的煩人和不切實際運行我的程序,我可能想連續多次運行它以進行測試 –

+0

當您授權時,您希望請求離線訪問。您可以保存令牌,並在訪問令牌到期時使用刷新令牌獲取新令牌 - 您無需每次授權。 –

相關問題