Google calendarList 未使用服务帐户返回新的日历资源

Google calendarList not returning new calendar resources using a service account

我有一个用于房间预订的应用程序,它连接到 G Suite 日历并允许您参加 list/book/cancel 会议。

为此,最初会发出请求以收集与服务帐户关联的电子邮件资源列表,如下所示:https://developers.google.com/calendar/v3/reference/calendarList/list

请求有效,但仅 returns 旧资源,而不是新资源。 注意:如果我直接在 Google API 中尝试使用管理员身份验证,那么我将获得所有资源。

这是我的示例代码:

const { GoogleToken } = require('gtoken');

const { XMLHttpRequest } = require('xmlhttprequest');

const gtoken = new GoogleToken({
  keyFile: 'signmeeting-gsuite-0ffd58e3a355.json',
  scope: [
    'https://www.googleapis.com/auth/calendar',
    'https://www.googleapis.com/auth/calendar.readonly'
  ] // or space-delimited string of scopes
});

gtoken.getToken(async (err, tokens) => {
  if (err) {
    console.log(err);
    return;
  }
  console.log(tokens);
  try {
    await sendXhrRequest(tokens);
  } catch (error) {
    console.log(error);
  }
});

async function sendXhrRequest(tokens) {
  try {
    const xhr = new XMLHttpRequest();
    xhr.addEventListener("load", onLoad);
    xhr.addEventListener("error", onError);
    xhr.open("GET", "https://www.googleapis.com/calendar/v3/users/me/calendarList");
    xhr.setRequestHeader("Authorization", "Bearer " + tokens.access_token);
    xhr.setRequestHeader("Content-Type", "application/json");
    xhr.send();
  } catch (error) {
    console.log(error);
  }
}

function onLoad() {
  console.log(this.status);
  if (this.responseText) {
    console.log(JSON.parse(this.responseText));
  }
}

function onError() {
  console.log(this.status);
}

能否请您告诉我 Google API 中发生了什么变化,以便不返回新资源?以及如何修复它?

注意:我注意到旧的资源电子邮件地址以组织单位作为前缀而不是新的。

提前致谢

CalendarList.list returns 已添加到当前已验证用户日历列表的所有日历。

日历列表显示在 google 日历 Web 应用程序的左下角。此列表并非 始终保持最新,这取决于当前经过身份验证的用户如何被授予访问此新日历的权限。如果它是通过 Web 应用程序完成的,则应该添加它,除非您使用的是服务帐户。 (注意:它过去是通过服务帐户自动添加的,但不久前被删除了)

如果某个用户的日历列表中没有它们,那么我建议您只做一个 calendarList.Insert 并添加它。

服务帐号

以下是来自 google 的一些官方信息,说明为什么服务帐户不再自动在日历列表中拥有共享日历。

服务帐户不再接受自动共享的日历