我正在尝试创建一个网络应用程序,该应用程序从我的Google日历帐户中获取数据并将其放在使用自己的日历程序的网站上。我不希望每次运行该程序时都必须获得该帐户的用户权限,因为我是该帐户的用户,并且根据 https://developers.google.com/api-client-library/ruby/auth/service-accounts 和 https://developers.google.com/identity/protocols/OAuth2 ,似乎唯一的方法是使用服务帐户。这是我的方案的理想选择吗?无论如何,我设置了一个服务帐户,使用我的凭据生成了JSON文件,并尝试创建将返回我的日历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帐户相关联的文档。关于如何使用Google Apps Domain,Google App Engine或Google Compute Engine可以让您访问多个用户的帐户,有很多信息,但我不想使用任何这些东西,因为我相对简单Ruby程序(我甚至不使用Rails或Sinatra)。我宁愿只在Heroku服务器上托管该程序,我已经在其中设置了其他类似的程序。是否有任何其他原因导致API响应变为空?如果API无法知道从哪个帐户获取数据,那么API是否应该返回任何内容?
答案 0 :(得分:0)
我发现我的问题是。我需要转到我的Google日历帐户并更改日历的设置,以便它可以授予与我的服务帐户共享其信息的权限。我必须单击Google日历页面右上角的齿轮图标,转到设置,转到日历,单击共享:编辑设置,输入我的服务帐户的电子邮件地址,并将权限设置设置为1下拉菜单中的make更改选项。
答案 1 :(得分:0)
您不应该使用服务帐户。您应该能够使用oauth2让用户授权您的服务读取和管理他们的日历,然后保存访问令牌和刷新令牌。