【问题标题】:How do I use the Google Calendar API client library for Ruby to get a list of calendar IDs for only my account?如何使用 Ruby 的 Google 日历 API 客户端库获取仅为我的帐户提供的日历 ID 列表?
【发布时间】:2016-03-12 12:24:37
【问题描述】:

我正在尝试创建一个网络应用程序,该应用程序从我的谷歌日历帐户中获取数据并将其放在使用自己的日历程序的网站上。我不想每次运行程序时都必须获得该帐户的用户权限,因为我是该帐户的用户,并且根据 https://developers.google.com/api-client-library/ruby/auth/service-accountshttps://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:那我如何访问服务帐户的谷歌日历?

标签: ruby google-calendar-api


【解决方案1】:

我发现我的问题是。我需要转到我的谷歌日历帐户并更改日历的设置,以便它可以允许与我的服务帐户共享其信息。我不得不点击谷歌日历页面右上角的齿轮图标,进入设置,进入日历,点击共享:编辑设置,输入我的服务帐户的电子邮件地址,并将权限设置设置为一个下拉菜单上的“进行更改”选项。

【讨论】:

    【解决方案2】:

    您不必使用服务帐户。您应该能够使用 oauth2 让用户授权您的服务读取和管理他们的日历,然后保存访问令牌和刷新令牌。

    【讨论】:

    • 这个问题是我是需要授权日历的用户。每次我想运行我的程序时都必须在网页上单击“是”,这既烦人又不切实际。我可能想连续运行几次以进行测试。
    • 授权时要请求离线访问。您可以保存令牌,当访问令牌过期时,使用刷新令牌获取一个新令牌 - 无需您每次都授权。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-09
    • 1970-01-01
    • 2013-11-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多