无法在红宝石中冒充服务到服务oauth请求google calendar api

时间:2014-10-27 10:50:38

标签: ruby google-api google-api-ruby-client

嗨我是深夜黑客并测试google api客户端的Ruby。

我可能因错误理解而陷入错误。

我已经完成了什么

  • 我已经在google开发者控制台中创建了一个应用
  • 我启用了日历api
  • 我创建了服务器密钥并下载了p12。
  • 我设法使用google api资源管理器和浏览器oauth查看日历元数据,因此确认了ID,并且浏览器的oauth也可以查看元数据

我正在采取行动:

我正试图从私人共享的日历中获取元数据(稍后我会尝试事件),我在谷歌应用程序中读取权限(通过一个组)在Ruby上的工作帐户服务auth < / p>

我是如何选择这样做的

使用此代码:

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,类似于&#34;日历不存在&#34;

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

但是,如果我更改了每个&#39;

的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"
}

这似乎是一个日历,但它类似于&#34;电子邮件发行商的默认日历&#34;出现在服务器密钥中的帐户&#34; email&#34;字段

我还尝试将:person = 'email'字段添加到client.authorization但是我在创建身份验证令时出错

我无法找到一种方法来访问api,因为其他邮件帐户与@ developer.gserviceaccount.com不同,所以我做错了什么?

1 个答案:

答案 0 :(得分:1)

您可以与服务帐户的电子邮件共享日历,也可以点击these steps以允许服务帐户模拟该域中的任何用户,在这种情况下,您必须传递:person => 'email'参数。< / p>