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 的一些官方信息,说明为什么服务帐户不再自动在日历列表中拥有共享日历。
我有一个用于房间预订的应用程序,它连接到 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 的一些官方信息,说明为什么服务帐户不再自动在日历列表中拥有共享日历。