与共享日历共享后,ServiceAccout已空白calendarList

时间:2017-03-15 12:11:01

标签: rest google-api service-accounts google-calendar-api

在通过Google控制台创建新服务帐户时,当与服务帐户共享日历时,日历不会显示在经过身份验证的服务帐户的calendarList响应中。

这项工作好一段时间了,但最近似乎已经开始失败了。

奇怪的是,如果我删除日历上的共享帐户条目然后重新添加,它通常会起作用。它似乎不是时间延迟,因为最初等待了几个小时,并且在日历列表中始终为零,直到删除日历上的共享帐户并重新转发。

以下是我用来复制的步骤:

  1. 在Google控制台网页用户界面中,创建一个新的服务帐户,选择“提供新的私钥”以下载JSON密钥。
  2. 在Google日历网络用户界面中,转到日历设置和“共享此日历”,然后与服务帐户电子邮件共享日历,然后保存更改。
  3. 在REST调用中,使用对oauth2/v3/token
  4. 的POST调用的JSON密钥进行身份验证
  5. 发送calendar/v3/users/me/calendarList
  6. 的GET请求

    然后可选择显示它正常工作......

    1. 从日历中删除服务帐户共享并保存。
    2. 将服务帐户电子邮件添加到日历共享并保存。
    3. 重复步骤2和3.这次可能会有效。
    4. 这部分是我们最终用户通过Google网络用户界面创建服务帐户和共享日历的手动过程。请注意,我一直在自己的Google帐户上使用其他日历与服务帐户共享(这反映了我们的最终用户使用案例),而不仅仅是默认日历。

      客户端代码基于REST。为了提供示例,我在下面展示了REST请求和响应。只有两个请求,一个用于验证,一个用于获取calendarList。这些操作发生在用户界面中的手动步骤之后,以创建服务帐户,然后与该帐户共享日历。

      ---
      Request:
      POST https://www.googleapis.com/oauth2/v3/token HTTP/1.1
      Accept: application/json, application/xml, text/json, text/x-json, text/javascript, text/xml
      User-Agent: RestSharp/105.2.3.0
      Content-Type: application/x-www-form-urlencoded
      Host: www.googleapis.com
      Content-Length: 758
      Accept-Encoding: gzip, deflate
      Connection: Keep-Alive
      
      grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer&assertion=[ASSERTION_JWT_HERE]
      
      Response:
      HTTP/1.1 200 OK
      Cache-Control: no-cache, no-store, max-age=0, must-revalidate
      Pragma: no-cache
      Expires: Mon, 01 Jan 1990 00:00:00 GMT
      Date: Tue, 14 Mar 2017 20:17:18 GMT
      Vary: Origin
      Vary: X-Origin
      Content-Type: application/json; charset=UTF-8
      X-Content-Type-Options: nosniff
      X-Frame-Options: SAMEORIGIN
      X-XSS-Protection: 1; mode=block
      Server: GSE
      Alt-Svc: quic=":443"; ma=2592000; v="36,35,34"
      Content-Length: 197
      
      {
       "access_token": "ya29.ElkOBAzSOzE_J2VOGFeWnTAGXdtoadW2FbnGga99SrMeamL7j6KetKomvT4aoy4jsRCcXpK-N6sxRBLFUaj_kPWFin4m6xvg_CtaTtkG5tVc_IxS7IezJDf32g",
       "token_type": "Bearer",
       "expires_in": 3600
      }
      ---
      
      ---
      Request
      GET https://www.googleapis.com/calendar/v3/users/me/calendarList?minAccessRole=reader HTTP/1.1
      Authorization: Bearer ya29.ElkOBAzSOzE_J2VOGFeWnTAGXdtoadW2FbnGga99SrMeamL7j6KetKomvT4aoy4jsRCcXpK-N6sxRBLFUaj_kPWFin4m6xvg_CtaTtkG5tVc_IxS7IezJDf32g
      Accept: application/json, application/xml, text/json, text/x-json, text/javascript, text/xml
      User-Agent: RestSharp/105.2.3.0
      Host: www.googleapis.com
      Accept-Encoding: gzip, deflate
      
      Response:
      HTTP/1.1 200 OK
      Expires: Tue, 14 Mar 2017 20:17:19 GMT
      Date: Tue, 14 Mar 2017 20:17:19 GMT
      Cache-Control: private, max-age=0, must-revalidate, no-transform
      Vary: Origin
      Vary: X-Origin
      Content-Type: application/json; charset=UTF-8
      X-Content-Type-Options: nosniff
      X-Frame-Options: SAMEORIGIN
      X-XSS-Protection: 1; mode=block
      Content-Length: 202
      Server: GSE
      Alt-Svc: quic=":443"; ma=2592000; v="36,35,34"
      
      {
       "kind": "calendar#calendarList",
       "etag": "\"p328bl14pt3bd40g\"",
       "nextSyncToken": "CJC6hJno1tICEj10ZXN0MS05MjhAY2FsZW5kYXItY29ubmVjdG9yLS0tb25lbGFuLmlhbS5nc2VydmljZWFjY291bnQuY29t",
       "items": []
      }
      ---
      

      注意,我没有为ouath请求提供实际的JWT,但是身份验证工作正常。另请注意,日历将作为服务帐户读取或修改共享。我还可以查询日历本身并使用服务帐户获取事件,但它正在查询与失败帐户关联的日历列表。

      此外还提出了这个问题here但是在这里发布这个也是为了我遗漏了一些东西,尽管如上所述这一切都很好,直到最近,我们现有的未更改的客户端软件已经开始失败了新创建的服务帐户。

1 个答案:

答案 0 :(得分:0)

当您与某人通过Google日历网站分享日历时,网站上的代码会自动将日历添加到用户calendar.list。所有日历都是谷歌日历网站左下角的列表。用户可以访问日历,而不必使用日历表。

当共享日历时,希望服务帐户并不总是这样。我共享过我的日历的所有服务帐户都没有在calendarlist中有任何内容。如果您需要它在calendarlist中,那么您应该让服务帐户插入它。使用CalendarList: insert只需从网站上获取相关的日历ID。