在通过Google控制台创建新服务帐户时,当与服务帐户共享日历时,日历不会显示在经过身份验证的服务帐户的calendarList响应中。
这项工作好一段时间了,但最近似乎已经开始失败了。
奇怪的是,如果我删除日历上的共享帐户条目然后重新添加,它通常会起作用。它似乎不是时间延迟,因为最初等待了几个小时,并且在日历列表中始终为零,直到删除日历上的共享帐户并重新转发。
以下是我用来复制的步骤:
oauth2/v3/token
calendar/v3/users/me/calendarList
然后可选择显示它正常工作......
这部分是我们最终用户通过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但是在这里发布这个也是为了我遗漏了一些东西,尽管如上所述这一切都很好,直到最近,我们现有的未更改的客户端软件已经开始失败了新创建的服务帐户。
答案 0 :(得分:0)
当您与某人通过Google日历网站分享日历时,网站上的代码会自动将日历添加到用户calendar.list。所有日历都是谷歌日历网站左下角的列表。用户可以访问日历,而不必使用日历表。
当共享日历时,希望服务帐户并不总是这样。我共享过我的日历的所有服务帐户都没有在calendarlist中有任何内容。如果您需要它在calendarlist中,那么您应该让服务帐户插入它。使用CalendarList: insert只需从网站上获取相关的日历ID。