Javascript: Google 日历 + api: 服务帐户
Javascript: Google Calender + gapi: service account
我的应用程序使用 Firebase 来让用户登录,他们可以访问一个日历,该日历专门创建为一个通用日历,用于添加和删除预订。
可以说,该应用为此目的拥有自己的 gmail 地址。该应用程序通过 google API(gapi 客户端)访问。
为了让用户能够与日历交互,我发现我只能使用日历/应用程序的服务帐户。
到目前为止我设法:
- 为服务帐户创建服务密钥,
- 与服务帐户 "dummy" 用户共享日历,
- 使用该服务密钥(证书)创建 JWT 令牌(使用 jsrsasign 库),
- 发出 POST 请求以获取 gapi 的访问令牌,
- 初始化gapi auth和client,并通过gapi访问日历
现在,当我开始检索 google 日历事件时,我确实得到了成功的响应,但是事件数组是空的,即使共享日历中有可用的测试事件也是如此。
响应如下所示:
{
"kind": "calendar#events",
"etag": "\"pqef3g4h5j6j0g\"",
"summary": "my_app_email@appspot.gserviceaccount.com",
"updated": "2019-01-15T21:14:05.029Z",
"timeZone": "UTC",
"accessRole": "owner",
"defaultReminders": [],
"items": []
}
Whosebug 上有一些与此相关的主题,但其中 none 具有有用的信息,或者它们适用于 Pythin / PHP。
我希望有人可以就此提出建议 Javascript...
我解决了这个问题...问题出在获取事件时的 gapi 请求中。
我使用了错误的 calendarId。我将其值设置为默认值 'primary',但要使用的实际 calendarId 可以在 Google 日历设置 >> 集成日历下找到。在我的设置中,calendarId 是关联帐户的电子邮件地址。
因此 gapi 请求如下所示:
const fetchTimeLimit = new Date(2019, 0, 1).toISOString();
let events = await gapi.client.calendar.events.list({
calendarId: 'calendar_email@gmail.com',
timeMin: fetchTimeLimit,
showDeleted: false,
singleEvents: true,
maxResults: 300,
orderBy: 'startTime'
})
.then(response => { ........etc
我的应用程序使用 Firebase 来让用户登录,他们可以访问一个日历,该日历专门创建为一个通用日历,用于添加和删除预订。
可以说,该应用为此目的拥有自己的 gmail 地址。该应用程序通过 google API(gapi 客户端)访问。
为了让用户能够与日历交互,我发现我只能使用日历/应用程序的服务帐户。
到目前为止我设法:
- 为服务帐户创建服务密钥,
- 与服务帐户 "dummy" 用户共享日历,
- 使用该服务密钥(证书)创建 JWT 令牌(使用 jsrsasign 库),
- 发出 POST 请求以获取 gapi 的访问令牌,
- 初始化gapi auth和client,并通过gapi访问日历
现在,当我开始检索 google 日历事件时,我确实得到了成功的响应,但是事件数组是空的,即使共享日历中有可用的测试事件也是如此。
响应如下所示:
{
"kind": "calendar#events",
"etag": "\"pqef3g4h5j6j0g\"",
"summary": "my_app_email@appspot.gserviceaccount.com",
"updated": "2019-01-15T21:14:05.029Z",
"timeZone": "UTC",
"accessRole": "owner",
"defaultReminders": [],
"items": []
}
Whosebug 上有一些与此相关的主题,但其中 none 具有有用的信息,或者它们适用于 Pythin / PHP。
我希望有人可以就此提出建议 Javascript...
我解决了这个问题...问题出在获取事件时的 gapi 请求中。 我使用了错误的 calendarId。我将其值设置为默认值 'primary',但要使用的实际 calendarId 可以在 Google 日历设置 >> 集成日历下找到。在我的设置中,calendarId 是关联帐户的电子邮件地址。
因此 gapi 请求如下所示:
const fetchTimeLimit = new Date(2019, 0, 1).toISOString();
let events = await gapi.client.calendar.events.list({
calendarId: 'calendar_email@gmail.com',
timeMin: fetchTimeLimit,
showDeleted: false,
singleEvents: true,
maxResults: 300,
orderBy: 'startTime'
})
.then(response => { ........etc