谷歌日历API Nodejs-服务帐户-委派



我是Google应用程序域的管理员,负责日历API。日历应用程序在管理控制台中标记为已为所有用户激活。共享参数:通过管理日历应用控制台,为内部和外部用户共享所有信息,无需修改权限。我创建了一个共享资源并订阅了它的议程。为了简化,我为大家分享了可用性信息的议程。

我用不同的方式实现了一个应用程序,以获得最佳效果。从谷歌应用程序脚本(HTML)、浏览器端脚本和nodejs服务器端脚本(浏览器端授权)来看,一切都很好。用户总是被要求通过谷歌登录和权限对话框以交互方式授予访问权限。

现在,我想要一个nodejs服务器端应用程序,该应用程序具有对议程(即共享资源)的委派访问权限,而无需用户交互授予访问权限。所以我使用的是服务帐户。现在开始编码。

所以项目创建了,我激活了日历API,验证了源代码(google-verification页面是静态的http://ip:8080通过nodejsexpress脚本进行验证)。域验证并没有真正意义(没有反向DNS名称)。授权URL设置已设置,但对服务器应用程序无效,它是为浏览器端应用程序设置的。

我创建了带有委托的服务帐户,并获得了带有私钥的json文件,并将其复制到服务器上。OAuth2客户端创建良好,我授权客户端ID访问日历API R/W。一切似乎都很好。

var google = require('googleapis')
var calendar = google.calendar('v3')
var scopes = ['https://www.googleapis.com/auth/calendar']
var key = require ('./xxx'); // private json
var jwtClient = new google.auth.JWT(key.client_email, null, key.private_key, scopes, null );
jwtClient.authorize(function(err, token) {
if(err) { ... }
console.log('token',token);
listCalendars(jwtClient);
});

脚本正在获得授权,我获得了访问令牌。

{ access_token: 'xxxxxxxxxx',
token_type: 'Bearer',
expiry_date: 1464780030000,
refresh_token: 'jwt-placeholder' }

对calendarList.list的调用成功。。。

function listCalendars(auth) {
calendar.calendarList.list({ auth: auth }, function(err, response) {
if (err) { ... }
console.log(response);
listEvents(auth)
})
}

但没有项目

{ kind: 'calendar#calendarList',
etag: '"1464776865512000"',
nextSyncToken: 'xxxxxx',
items: [] }

服务帐户没有议程,所以这并不一定令人惊讶,但我认为,通过授权访问,我可以获得域中所有议程(用户和资源)的列表。

  1. 所以我的第一个问题是为什么这里没有列出日历

现在我想列出我自己议程中即将发生的事件(我是服务帐户的所有者)。

function listEvents(auth) {
calendar.events.list({
auth: auth,
// calendarId: 'primary',
calendarId: 'me@mydomain.tld',
timeMin: new Date().toISOString(),
maxResults: 10,
singleEvents: true,
orderBy: 'startTime'
}, function(err, response) {
if(err) { ... }
var events = response.items;
if(events.length == 0) { ... }
...
});
}

我收到一个错误

The API call returned an error: Error: Not Found
  1. 我的第二个问题是为什么我无法访问我的用户日历事件,即使我明确指定了ID?

  2. 我的最后一个问题是如何访问共享资源议程和活动?(mydomain.tld_xxxxxxxx@resource.calendar.google.com)

感谢您的帮助,我会处理这个问题

(代表OP发布)

即使日历是公开共享的,也必须明确设置服务帐户的电子邮件地址以用于共享每个日历。

最新更新