如何通过服务帐号(Google 日历 API)获取资源日历的活动?



我编写了一个 Node/Express 应用程序,并希望通过服务帐户从资源日历访问事件。 当我使用我的个人日历时,它工作正常,但使用资源日历时,它会给我一个空白页。

这就是我必须走的路。我必须更改什么才能使其正常工作?

let express = require('express');
let app = express();
let {google} = require('googleapis');
const calendar = google.calendar('v3');
const port = 3000;
const key = require('./credentials.json');
const jwtClient = new google.auth.JWT(
key.client_email,
null,
key.private_key,
[ 'https://www.googleapis.com/auth/calendar' ],
null
);
jwtClient.authorize(function(err) {
if (!err) {
console.log("Authorization worked!");
}
});
const calendarID = 'XXXXX@resource.calendar.google.com';
app.get('/', function(req, res) {
calendar.events.list({
auth: jwtClient,
calendarId: calendarID,
timeMin: (new Date()).toISOString(),
maxResults: 2,
singleEvents: true,
orderBy: 'startTime'
}, function(err, resp) {
res.json(resp);
});
});
app.listen(port, function(err){
if (!err) {
console.log("XXXXX is running on port", port);
} else {
console.log(JSON.stringify(err));
}
});

任何帮助将不胜感激:)

服务帐户的工作方式与常规帐户类似 - 它们具有自己的权限,除非明确授予对日历信息的访问权限,否则无法访问日历信息。

为了克服这个问题,您可以:

  1. 将日历共享到您的服务帐号。您只需像与任何普通用户一样共享它,尽管分配了服务帐户的电子邮件。

  2. 如果您使用的是 G Suite(非普通/个人帐号(,请使用全网域授权。您可以在提供的超链接中了解更多信息。此功能允许您"模拟"域的其他用户,这不仅允许您检索事件,还可以根据需要修改日历和事件,因为您将拥有"所有者"权限。

最新更新