Javascript:Google Calender + GABI:服务帐户

时间:2019-01-16 17:11:14

标签: javascript calendar service-accounts gapi

我的应用程序使用Firebase登录用户,他们可以访问日历,日历尤其是创建为单个普通日历来添加和删除预订。

为此,该应用拥有自己的Gmail地址。通过google API(gapi客户端)访问该应用。

为了使用户能够与日历进行交互,我发现我只能使用日历/应用程序的服务帐户。

到目前为止,我设法做到了:

  • 为服务帐户创建服务密钥,
  • 与服务帐户“虚拟”用户共享日历,
  • 使用该服务密钥(证书)创建JWT令牌(使用jsrsasign库)
  • 发出POST请求以获取gapi的访问令牌,
  • 初始化gapi身份验证和客户端,并可以通过gapi访问日历

现在,当我要检索google Calendar事件时,我确实获得了成功的响应,但是即使共享日历中有可用的测试事件,事件数组也为空。

响应如下:

{
 "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": []
}

关于Stackoverflow,有一些与此相关的主题,但是没有一个有用的信息,或者是针对Pythin / PHP的。

我希望有人可以为此提供建议以Java脚本...

1 个答案:

答案 0 :(得分:0)

我解决了这个问题。问题是在获取事件时出现在gapi请求中。 我使用了错误的calendarId。我已将其值设置为默认的“主要”,但可以在Google日历设置>>集成日历下找到要使用的实际calendarId。在我的设置中,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