【发布时间】:2016-03-12 12:24:37
【问题描述】:
我正在尝试创建一个网络应用程序,该应用程序从我的谷歌日历帐户中获取数据并将其放在使用自己的日历程序的网站上。我不想每次运行程序时都必须获得该帐户的用户权限,因为我是该帐户的用户,并且根据 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 的响应。但是,即使我的谷歌日历帐户在屏幕左侧的“我的日历”菜单下清楚地列出了多个日历,并且每个日历都有多个与之关联的事件,response.items 字段总是显示为空。我猜问题是我的服务帐户与我的谷歌日历帐户没有正确关联。但是,我找不到任何说明如何将服务帐户与单个 Google 帐户相关联的文档。有很多关于如何使用 Google Apps Domain、Google App Engine 或 Google Compute Engine 可以让您访问多个用户的帐户的信息,但我不想在我相对简单的 Ruby 程序中使用这些东西(我什至没有使用 Rails 或 Sinatra)。我宁愿只在 Heroku 服务器上托管程序,在那里我已经设置了其他类似的程序。 API响应会变成空的还有其他原因吗?如果 API 不知道从哪个帐户获取数据,它是否应该返回任何内容?
【问题讨论】:
-
我看到您将应用凭据存储在环境变量“GOOGLE_APPLICATION_CREDENTIALS”中,但您在请求访问令牌时没有在授权阶段的任何地方使用它,为什么会这样?
-
据我了解,如果您使用的是服务帐户,它会从该帐户获取日历项目,而不是您的。请记住,服务帐户是服务器到服务器的交互,其中帐户属于应用程序而不是用户。
-
@sghosh968:get_application_default 是一种方法,它是 Google 应用程序默认凭据的一部分,其文档说“检查了环境变量 GOOGLE_APPLICATION_CREDENTIALS。如果指定了此变量,它应该指向一个文件定义凭据。
-
@adjuremods:那我如何访问服务帐户的谷歌日历?