1

嗨,我在深夜破解和测试 Ruby 的 google api 客户端。

我可能是由于误解而误入歧途。

我已经做了什么

  • 我已经在谷歌开发者控制台中创建了一个应用程序
  • 我启用了日历 api
  • 我创建了服务器密钥并下载了 p12。
  • 我设法使用google api explorer和浏览器oauth查看了日历元数据,因此确认了id并且权限也被确认为浏览器的oauth可以查看元数据

我正在尝试做的事情:

我正在尝试从私人共享日历中获取元数据(稍后我将尝试事件),在该日历中,我在 Ruby 中的工作帐户的 google 应用程序中具有读取权限(通过组),提供服务身份验证服务

我是如何努力做到的

使用此代码:

require 'google/api_client'
require 'pp'
client = Google::APIClient.new

cal = client.discovered_api('calendar','v3')

id = 'xxxxxxxxxxxxxxxxxxxxxx@group.calendar.google.com'  # id is the confirmed calendar ID

key = Google::APIClient::KeyUtils.load_from_pkcs12('sl.p12', 'notasecret')
client.authorization = Signet::OAuth2::Client.new(
  :token_credential_uri => 'https://accounts.google.com/o/oauth2/token',
  :audience => 'https://accounts.google.com/o/oauth2/token',
  :scope => 'https://www.googleapis.com/auth/calendar',
  :issuer => 'xxxxxxxxxxxxxxxxxxxxxxxxxxx@developer.gserviceaccount.com',  # confirmed issuer

  :signing_key => key
)

client.authorization.fetch_access_token!

result = client.execute(
  :api_method => cal.calendars.get,  
  :parameters => { 'calendarId' => id }  
)

puts result.response.body

pp result

收集的结果

当我这样做时会得到 404,类似于“那个日历不存在”

{
  "error": {
    "errors": [
      {
        "domain": "global",
        "reason": "notFound",
        "message": "Not Found"
      }
    ],
    "code": 404,
    "message": "Not Found"
  }
}

但是,如果我更改每个“主要”的 id

我得到:

{
 "kind": "calendar#calendar",
 "etag": "\"dAAhx6wYoPw2vqRAe54lk5wa0XQ/WEglF6_c5pVHKyggcENvvX1cS9g\"",
 "id": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx@developer.gserviceaccount.com",    #same as issuer id ??? WTF
 "summary": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx@developer.gserviceaccount.com",
 "timeZone": "UTC"
}

这似乎是一个日历,但它就像出现在服务器密钥“电子邮件”字段中的“电子邮件颁发者”帐户的默认日历

我也尝试向其中添加一个:person = 'email'字段,client.authorization但随后在创建身份验证令牌时出现错误

我找不到从该@developer.gserviceaccount.com 访问其他邮件帐户的方法,所以我做错了什么?

4

1 回答 1

1

您可以与服务帐户的电子邮件共享日历,也可以按照以下步骤允许服务帐户模拟该域上的任何用户,在这种情况下,您必须传递:person => 'email'参数。

于 2014-11-02T21:41:13.560 回答