我正在嘗試創建一個Web應用程序,它從我的Google日曆帳戶獲取數據並將其放在使用其自己的日曆程序的網站上。我不希望每次運行該程序都必須獲得用戶對該帳戶的許可,因爲我是該帳戶的用戶,並且根據https://developers.google.com/api-client-library/ruby/auth/service-accounts和https://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不知道從哪個帳戶獲取數據,它甚至應該返回任何東西?
我看到您正在將您的應用憑據存儲在環境變量「GOOGLE_APPLICATION_CREDENTIALS」中,但您在請求訪問令牌時並未在授權階段的任何地方使用它,爲什麼呢? – sghosh968
根據我的理解,如果您使用服務帳戶,則從該帳戶獲取日曆項目,而不是您的帳戶。請記住,服務帳戶是服務器到服務器的交互,其中帳戶屬於應用程序而不是用戶。 – adjuremods
@ sghosh968:get_application_default是屬於Google應用程序默認憑證的一種方法,其文檔說明「環境變量GOOGLE_APPLICATION_CREDENTIALS已被選中,如果指定了該變量,它應該指向定義憑證的文件 –