Rest 共享日历后,ServiceAccout的日历列表为空

Rest 共享日历后,ServiceAccout的日历列表为空,rest,google-api,service-accounts,google-calendar-api,Rest,Google Api,Service Accounts,Google Calendar Api,在通过Google控制台创建新服务帐户时,当与该服务帐户共享日历时,该日历不会出现在已验证服务帐户的calendarList响应中 这在一段时间内运行正常,但最近似乎开始失败 奇怪的是,如果我删除日历上的共享帐户条目,然后再将其添加回日历,它通常会起作用。这似乎不是一个时间延迟,因为在删除日历上的共享帐户并重新共享之前,最初等待了数小时,日历列表中的结果始终为零 以下是我用来重现的步骤: 在Google控制台web UI中,创建一个新的服务帐户,选择“提供一个新的私钥”下载JSON密钥 在Goo

在通过Google控制台创建新服务帐户时,当与该服务帐户共享日历时,该日历不会出现在已验证服务帐户的calendarList响应中

这在一段时间内运行正常,但最近似乎开始失败

奇怪的是,如果我删除日历上的共享帐户条目,然后再将其添加回日历,它通常会起作用。这似乎不是一个时间延迟,因为在删除日历上的共享帐户并重新共享之前,最初等待了数小时,日历列表中的结果始终为零

以下是我用来重现的步骤:

  • 在Google控制台web UI中,创建一个新的服务帐户,选择“提供一个新的私钥”下载JSON密钥
  • 在Google Calendar web UI中,转到日历设置并“共享此日历”,然后与服务帐户电子邮件共享日历,然后保存更改
  • 在REST调用中,使用JSON密钥对
    oauth2/v3/token
  • 发送获取日历/v3/users/me/calendarList的请求
  • 然后可选地显示它正在工作

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

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

    ---
    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,但是身份验证工作正常。另请注意,日历以读取或修改方式与服务帐户共享。我还可以查询日历本身,并使用服务帐户获取事件,但它正在查询与失败帐户关联的日历列表


    我也曾提出过这个问题,但为了防止我遗漏了什么,我也在这里发布了这个帖子,尽管之前我说过,所有这些都很好,直到最近,而我们现有的未更改的客户端软件在新创建的服务帐户中开始出现故障。

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


    在共享日历和服务帐户时,这种情况并不总是发生。与我共享日历的服务帐户中,没有一个帐户的日历中有任何内容。如果您需要它在日历列表中,那么您应该让服务帐户插入它。使用只需从网站上抓取有问题的日历id。

    这对我们不起作用。最终用户希望能够通过日历web UI与他们创建(并在我们的应用程序中配置)的服务帐户共享日历。我们有一个功能,可以列出服务帐户可用的所有日历。使用CalendarList插入需要提供另一个UI,以允许最终用户配置日历,并让他们找到日历ID、复制和粘贴等,这对他们来说很复杂。正如我所说,这一切过去都很好,有些事情已经改变了。如果您删除并重新添加共享条目,它也可以正常工作。我建议我们做一些测试,看看是否有一种模式可以确定何时添加和何时不添加。正如我所说,我从未见过服务帐户在其日历列表中获得日历。